OpenGL ES 2.0多个着色器程序 – 纹理渲染不再工作

我的应用程序绘制了点精灵和标准四方纹理的混合。 直到最近,我还是使用了一个着色器程序 – 但片段着色器中的一个分支(决定是否使用点精灵坐标/颜色)严重限制了我的渲染性能。 我的片段着色器最初看起来像这样:

precision highp float; uniform sampler2D u_textureSprite; uniform bool u_isSprite; varying vec4 v_color; varying vec2 v_textureCoord; void main() { vec4 textureColor = texture2D(u_textureSprite, u_isSprite ? gl_PointCoord : v_textureCoord); if (u_isSprite) { gl_FragColor = v_color * textureColor; } else { gl_FragColor = textureColor; } } 

在OpenGL ES编程指南中读取Apple的build议使得使用多个着色器程序听起来像是一件容易的事情…只需创build另一个正常的程序,并在相关绘制代码之前调用glUseProgram()。 但是,由于这样做,我不能让纹理渲染工作。 两个新的片段着色器是:

pointSprite.fsh:

 precision highp float; uniform sampler2D s_textureSprite; varying vec4 v_color; void main() { vec4 textureColor = texture2D(s_textureSprite, gl_PointCoord); gl_FragColor = v_color * textureColor; } 

texture.fsh:

 precision highp float; uniform sampler2D s_texture; varying vec2 v_textureCoord; void main() { gl_FragColor = texture2D(s_texture, v_textureCoord); } 

我觉得很琐碎。 如果我忽略所有调用绘制纹理,我可以看到,点精灵呈现得很好。 纹理四边形,但是,只是渲染到一个纯色的灰色 – 顺便说一句,这个灰色不匹配任何glClearColor()颜色,我相信这是一个颜色从纹理的某个点,它试图呈现。

纹理渲染的一些示例代码如下所示:

 - (void)drawTexture:(GLuint)texture { glUseProgram(programs[PROGRAM_TEXTURE]); glBindTexture(GL_TEXTURE_2D, texture); glBindBuffer(GL_ARRAY_BUFFER, vertexBufferObjects[VBO_TEXTURE_VERTICES]); glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, GL_FALSE, sizeof(ISTextureData), (void*)offsetof(ISTextureData, vertex)); glEnableVertexAttribArray(ATTRIB_VERTEX); glVertexAttribPointer(ATTRIB_TEXTURE_COORD, 2, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(ISTextureData), (void*)offsetof(ISTextureData, textureCoord)); glEnableVertexAttribArray(ATTRIB_TEXTURE_COORD); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vertexBufferObjects[VBO_TEXTURE_INDICIES]); glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, (void*)0); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); glBindTexture(GL_TEXTURE_2D, 0); } 

此代码在不处理多个着色器时有效。 或者我是粗心的,纹理片段着色器代码是错误的?

谢谢

编辑:

那么这是一个漫长而痛苦的时间,真正令人恼火的是它不是一个代码问题,而是与项目目录名称有关。

我的Xcode项目目录是这样命名的:“ProjectName(current)”。 这是我遇到麻烦的项目。 我已经发现,改变这个文件夹的名称不同,使应用程序工作,并正确渲染背景纹理。 只是为了澄清 – 应用程序以前正常工作,除了在OpenGL渲染背景纹理,重命名项目文件夹后,一切工作正常。

任何想法,为什么这可能是?

你在哪里设置你的着色器的纹理统一? 您需要使用以下代码来指定纹理统一使用的相应纹理单元的编号:

 glActiveTexture(GL_TEXTURE2); glBindTexture(GL_TEXTURE_2D, sphereDepthMappingTexture); glUniform1i(sphereDepthPrecalculatedDepthTextureUniform, 2); 

glUniform1i()的第二个参数是glUniform1i()中拉出纹理的纹理单元的编号。

默认情况下,这个uniform是0,对应于GL_TEXTURE0,这就是为什么它可能在第一个地方工作,但是如果你将活动纹理单元切换到别的东西,你将不再能够读取着色器中的纹理。

奇怪的是,这与项目目录的名称有某种关系。 我的Xcode项目目录是这样命名的:“ProjectName(current)”。 这是我遇到麻烦的项目。 将这个文件夹名称更改为任何不同的应用程序工作,并正确渲染背景纹理。 很奇怪。