使用Shader cocos2dx加载带alpha的ETC1纹理
Loading ETC1 Textures with alpha using Shader cocos2dx
我正在关注此链接:http://sbcgamesdev.blogspot.in/2013/06/etc1-textures-loading-and-alpha.html
我有两个纹理,SpinWheel-hd.pkm(rgb)和SpinWheel1-hd.pkm(alpha)。我正在尝试用alpha加载ETC1纹理。得到的图像是白色的,根据链接,它应该是我的带有alpha的rgb纹理。我做错了什么?我使用的是cocos2dx 2.2.5
这是我的加载代码:
rgbTex = CCTextureCache::sharedTextureCache()->addETCImage("SpinWheel-hd.pkm");
MainScreen1 = CCSprite::create("SpinWheel-hd.pkm");
CCSize size1 = CCDirector::sharedDirector()->getWinSize();
MainScreen1->setPosition(ccp(size1.width/2+70, size1.height/2+70));
this->addChild(MainScreen1);
alphaTex = CCTextureCache::sharedTextureCache()->addETCImage("SpinWheel1-hd.pkm");
alphaTex->setAliasTexParameters();
CCGLProgram *shader = CCShaderCache::sharedShaderCache()->programForKey("monochromeShader");
shader->reset();
/ // Same code as before to initialize the shader
shader->initWithVertexShaderByteArray(cc_MonoChromeV, cc_MonoChrome);
MainScreen1->setShaderProgram(shader);
MainScreen1->getShaderProgram()->addAttribute(kCCAttributeNamePosition, kCCVertexAttrib_Position);
MainScreen1->getShaderProgram()->addAttribute(kCCAttributeNameTexCoord, kCCVertexAttrib_TexCoords);
MainScreen1->getShaderProgram()->link();
MainScreen1->getShaderProgram()->updateUniforms();
_maskLocation = glGetUniformLocation( MainScreen1->getShaderProgram()->getProgram(),"u_colorRampTexture");
glUniform1i(_maskLocation,1);
_textureLocation = glGetUniformLocation( MainScreen1->getShaderProgram()->getProgram(),"u_texture");
glUniform1i(_textureLocation, 0);
MainScreen1->getShaderProgram()->use();
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, rgbTex->getName());
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D,alphaTex->getName());
glActiveTexture(GL_TEXTURE0);
这是我的碎片着色器
"n
#ifdef GL_ES n
precision mediump float;n
#endifn
uniform sampler2D u_texture;n
uniform sampler2D u_colorRampTexture;n
varying mediump vec2 v_texture;n
void main(void)n
{n
gl_FragColor = vec4(texture2D(u_texture, v_texture).rgb, texture2D(u_colorRampTexture, v_texture).r);n
}n
";
这是我的顶点着色器:
"n
attribute vec4 a_position; n
attribute mediump vec2 a_texture;n
n
#ifdef GL_ESn
varying mediump vec2 v_texture;n
#else n
varying vec2 v_texture; n
#endif n
n
void main(void)n
{n
gl_Position = CC_MVPMatrix * a_position;n
v_texture = a_texture;n
}n
";
我哪里错了?我看到的只是一张纯白的照片。
您的代码通常看起来是正确的,但有几个地方可能会导致问题。我会指出一些你应该检查的地方:
纹理加载:确保.pkm文件的格式和加载正确。您可以通过临时仅使用一个纹理(RGB或alpha)来检查纹理是否正确加载,并查看它们是否正确渲染。
Alpha通道处理:请确保Alpha纹理("SpinWheel1 hd.pkm")的格式正确,并且其Alpha信息确实存储在红色通道中。这是基于线gl_FragColor=vec4(texture2D(u_texture,v_texture).rgb,texture 2D(u_colorRampTexture,v_ttexture).r);在片段着色器中,假设alpha值存储在第二个纹理的红色通道中。
着色器编译:检查着色器的编译和链接是否没有错误。包括一些日志记录,以查看着色器编译和链接过程中是否存在任何错误。
统一位置:验证统一位置_maskLocation和_textureLocation是否为-1。如果他们是-1,这意味着制服没有找到,要么是因为他们没有活动,要么是他们的名字有印刷错误。
统一值:确保在使用着色器程序(MainScreen1->getShaderProgram()->之后设置统一值(glUniform1i);use();)。OpenGL要求将统一设置到的着色器程序当前处于活动状态。
纹理绑定:您可能还需要检查GL_TEXTURE0和GL_TEXTURE1是否正确设置并绑定到纹理。此外,在绑定所有纹理后,请确保活动纹理单位设置回程序在绘制操作期间所期望的单位(通常为GL_TEXTURE0)。
如果所有这些检查都很好,但您仍然有问题,那么问题可能是如何将着色器应用于cocos2d-x中的精灵。您可能需要子类化CCSprite并覆盖draw方法,以正确应用着色器并传递制服,具体取决于您使用的cocos2d-x版本。也有可能是cocos2d-x的默认精灵图形在某种程度上干扰了您的自定义着色器。
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- SFML纹理像播放器
- OpenGL大的3D纹理(>2GB)非常慢
- UE4-如何在给定4个屏幕坐标的情况下缩放纹理或材质
- 着色器纹理值与创建纹理时写入的值不同
- OpenGL将纹理四边形渲染为(0,0)
- 宽度为奇数的16位纹理为片状
- 使用 CUDA 和纹理进行图像减法
- 在不使用统一的情况下将纹理传递给 GLSL 着色器?
- 将使用太多的纹理插值器 - 带旋转的着色器
- dx11 渲染到纹理仅显示透明颜色
- OpenGL 4.3 错误地将第 4 个纹理坐标映射到与第 3 个纹理坐标相同的位置
- 如何使用 DXGI 格式DXGI_FORMAT_R1_UNORM创建 2D 纹理?
- 纹理单位重叠?渲染了错误的纹理
- SFML 纹理变换(放大)
- SDL2 二维纹理分配/池化
- Qt OpenGL 渲染到纹理性能问题
- 为什么我会得到黑色纹理?
- glBindTexture 是否覆盖活动纹理单元的内容
- 使用Shader cocos2dx加载带alpha的ETC1纹理