gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:08:42 25 4
gpt4 key购买 nike

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

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;
}
}

阅读 Apple 在 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;
}

纹理.fsh:

precision highp float;

uniform sampler2D s_texture;


varying vec2 v_textureCoord;

void main()

{
gl_FragColor = texture2D(s_texture, v_textureCoord);
}

我认为这很微不足道。如果我忽略所有绘制纹理的调用,我可以看到点 Sprite 渲染得很好。然而,纹理四边形只是渲染为纯灰色 - 顺便说一句,这种灰色与任何 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(当前)”。这是我遇到麻烦的项目。我后来发现,将此文件夹名称更改为任何不同的名称可以使应用程序正常工作,并正确渲染背景纹理。只是为了澄清 - 该应用程序以前工作正常,除了在 OpenGL 中渲染背景纹理之外,并且在重命名项目文件夹后,一切工作正常。

有什么想法吗?

最佳答案

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

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

这里glUniform1i()中的第二个参数是从中提取纹理的纹理单元的编号。

默认情况下,这个统一值为 0,对应于 GL_TEXTURE0,这就是为什么它一开始可能有效,但如果你将事件纹理单元切换到其他单元,你将无法再读取其中的纹理你的着色器。

关于ios - OpenGL ES 2.0 多个着色器程序 - 纹理渲染不再工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5743983/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com