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

Ios OpenGL ES 2.0多着色器程序-纹理渲染不再工作,ios,ipad,opengl-es,shader,opengl-es-2.0,Ios,Ipad,Opengl Es,Shader,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() {

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

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编程指南中阅读苹果的建议会让使用多个着色器程序听起来很简单。。。只需像正常情况一样创建另一个,并在相关绘图代码之前调用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;
}
precision highp float;

uniform sampler2D s_texture;


varying vec2 v_textureCoord;

void main()

{    
    gl_FragColor = texture2D(s_texture, v_textureCoord);
}
纹理。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;
}
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);
}
此代码在不处理多个着色器时有效。还是我太粗心了,而纹理片段着色器代码是错误的

谢谢

编辑:

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;
}
precision highp float;

uniform sampler2D s_texture;


varying vec2 v_textureCoord;

void main()

{    
    gl_FragColor = texture2D(s_texture, v_textureCoord);
}
好吧,这已经是一个漫长而痛苦的小时数,而真正令人恼火的是,它不知何故不是一个代码问题,而是与项目目录的名称有关

我的Xcode项目目录的名称如下:“ProjectName(current)”。这就是我遇到麻烦的项目。后来我发现,将此文件夹名称更改为任何不同的名称都可以使应用程序正常工作,并正确渲染背景纹理。只是想澄清一下-除了在OpenGL中渲染背景纹理外,该应用程序以前工作正常,重命名项目文件夹后,一切正常


你知道为什么会这样吗?

你在哪里为你的着色器设置统一的纹理?您需要指定用于纹理均匀性的适当纹理单元的编号,代码如下所示:

glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D, sphereDepthMappingTexture);
glUniform1i(sphereDepthPrecalculatedDepthTextureUniform, 2);
glUniform1i()
中的第二个参数是要从中提取纹理的纹理单元的编号


默认情况下,此统一将为0,对应于GL_TEXTURE0,这就是它可能首先工作的原因,但如果您将活动纹理单元切换到其他对象,您将无法再读取着色器中的纹理。

奇怪的是,这与项目目录的名称有某种关联。我的Xcode项目目录被命名为:“ProjectName(current)”。这就是我遇到麻烦的项目。将此文件夹名称更改为其他名称可以使应用程序正常工作,并正确渲染背景纹理。非常奇怪。

@Brad嗨,谢谢你的帮助。有趣的是,您应该提到,正如我之前在浏览了一些编程指南之后,确实有类似的代码,但是我删除了它,因为我显然设置错误,并且没有任何效果。我已经编辑了我的问题,并提供了更多的细节。@StuDev-作为对您更新的回应:用于纹理的纹理单位是您在
glActiveTexture()
中指定的,如果您随后使用
glBindTexture()
将其绑定到该单位。在上面的例子中,0是正确的值,正如我的示例中2是正确的值一样。您的统一标识符仅由
glUniform1i()
用于处理正确的统一,并且与纹理单位值无关。@Brad:我明白了,所以问题似乎出在其他地方。我还注意到,我已经为我的
ATTRIB_顶点调用了
glBindAttribLocation()
两次;每个节目一次。这是正确的做法吗?我试过毫无乐趣地调整。。。(对此很抱歉-到目前为止,我还没有在ES2.0中找到多个着色器的示例!)@StuDev-不幸的是,我不认为我拥有的任何示例应用程序在给定时间使用多个着色器渲染到一个场景,尽管它们确实使用纹理,所以您可以对此进行检查。下一个版本的Moleculars确实如此,我将发布该版本的源代码,但是应用程序还没有完全准备好。我在使用多个着色器时没有遇到任何单独着色器所没有的问题。@Brad:我想我在这方面取得了一些进展。在切换到两个着色器之前,我跳回了一个正在工作的项目,并一直在逐步回溯我的步骤。到目前为止看起来不错。。。我只想把第一次破坏我代码的愚蠢错误记下来!我找到后再发回来。