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)”。 这是我遇到麻烦的项目。 将这个文件夹名称更改为任何不同的应用程序工作,并正确渲染背景纹理。 很奇怪。
- 我怎样才能检查一个CLLocationCoordinate2D是否在四个CLLocationCoordinate2D Square内? 在目标C与谷歌地图
- 如何在iOS 10 / Sierra / Xcode 8中导入新的日志loggingfunction?