gpt4 book ai didi

ios - 具有不同 uv 坐标的 OpenGL ES 1 多纹理

转载 作者:可可西里 更新时间:2023-11-01 04:36:42 27 4
gpt4 key购买 nike

我需要使用多重纹理来渲染一个对象,但是对于同一个对象,两种纹理都有不同的 uv 坐标。一张是法线贴图,另一张是光照贴图。

请提供与此相关的任何有用 Material 。

最佳答案

在 OpenGL ES 2 中,您仍然可以使用着色器。所以你可以完全自由地使用你喜欢的任何纹理坐标。只需为第二个纹理坐标对引入一个附加属性并将其委托(delegate)给片段着色器,就像往常一样:

...
attribute vec2 texCoord0;
attribute vec2 texCoord1;

varying vec2 vTexCoord0;
varying vec2 vTexCoord1;

void main()
{
...
vTexCoord0 = texCoord0;
vTexCoord1 = texCoord1;
}

并且在片段着色器中使用各自的坐标来访问纹理:

...
uniform sampler2D tex0;
uniform sampler2D tex1;
...
varying vec2 vTexCoord0;
varying vec2 vTexCoord1;

void main()
{
... = texture2D(tex0, vTexCoord0);
... = texture2D(tex1, vTexCoord1);
}

当然,您需要为这个新属性提供数据(使用 glVertexAttribPointer)。但是,如果所有这些对您来说听起来很陌生,那么您应该更深入地研究 GLSL 着色器,或者您实际使用 OpenGL ES 1。在这种情况下,您应该重新标记您的问题,我会更新我的答案。

编辑:根据您对 OpenGL ES 1 的更新,情况有点不同。我假设您已经知道如何使用单个纹理并为此指定纹理坐标,否则您应该在深入研究多纹理之前从那里开始。

使用 glActiveTexture(GL_TEXTUREi) 您可以激活第 i 个纹理单元。以下所有与纹理状态相关的操作仅涉及第 i 个纹理单元(如 glBindTexture,还有 glTexEnvgl(En/Dis)able(GL_TEXTURE_2D))。

要指定纹理坐标,您仍然使用 glTexCoordPointer 函数,就像使用单个纹理一样,但是使用 glCientActiveTexture(GL_TEXTUREi) 您可以选择后续调用的纹理单元引用 glTexCoordPointerglEnableClientAttrib(GL_TEXTURE_COORD_ARRAY)

所以它会是这样的:

//bind and enable textures
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, <second texture>);
glTexEnv(<texture environment for second texture>); //maybe, if needed
glEnable(GL_TEXTURE_2D);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, <first texture>);
glTexEnv(<texture environment for first texture>); //maybe, if needed
glEnable(GL_TEXTURE_2D);

//set texture coordinates
glClientActiveTexture(GL_TEXTURE1);
glTexCoordPointer(<texCoords for second texture>);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glClientActiveTexture(GL_TEXTURE0);
glTexCoordPointer(<texCoords for first texture>);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);

//other arrays, like glVertexPointer, ...

glDrawArrays(...)/glDrawElements(...);

//disable arrays
glClientActiveTexture(GL_TEXTURE1);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glClientActiveTexture(GL_TEXTURE0);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);

//disable textures
glActiveTexture(GL_TEXTURE1);
glDisable(GL_TEXTURE_2D);
glActiveTexture(GL_TEXTURE0);
glDisable(GL_TEXTURE_2D);

我在第一个纹理之前为第二个纹理设置参数的原因只是为了在设置它们之后我们最终激活纹理单元 0。我想我已经看到驱动程序在绘图时出现问题,并且除单元 0 之外的另一个单元处于事件状态。在最后留下或多或少的干净状态总是一个好主意,这意味着默认纹理单元 (GL_TEXTURE0) 处于事件状态,否则不关心多纹理的代码可能会问题。

编辑:如果您使用立即模式 (glBegin/glEnd) 而不是顶点数组,那么您不使用 glTexCoordPointer,类(class)。在这种情况下,您当然也不需要 glClientAttribTexture。您只需要将 glMultiTexCoord(GL_TEXTUREi, ...) 与适当的纹理单元(GL_TEXTURE0, GL_TEXTURE1, ...)一起使用,而不是glTexCoord(...)。但是,如果我得到的信息是正确的,OpenGL ES 无论如何都没有即时模式。

关于ios - 具有不同 uv 坐标的 OpenGL ES 1 多纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7751382/

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