使用Shader cocos2dx加载带alpha的ETC1纹理

Loading ETC1 Textures with alpha using Shader cocos2dx

本文关键字:ETC1 纹理 alpha Shader cocos2dx 加载 使用      更新时间:2023-10-16

我正在关注此链接: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的默认精灵图形在某种程度上干扰了您的自定义着色器。