ios – 具有不同紫外线坐标的OpenGL ES 1多纹理

ios – 具有不同紫外线坐标的OpenGL ES 1多纹理,第1张

概述我需要使用多纹理渲染对象,但两个纹理对同一个对象都有不同的uv坐标.一个是法线贴图,另一个是光贴图. 请提供有关此的任何有用的材料. 在OpenGL ES 2中,无论如何都要使用着色器.因此,您可以完全自由地使用您喜欢的任何纹理坐标.只需为第二个纹理cooridnate对引入一个附加属性,并像往常一样将其委托给片段着色器: ...attribute vec2 texCoord0;attribu 我需要使用多纹理渲染对象,但两个纹理对同一个对象都有不同的uv坐标.一个是法线贴图,另一个是光贴图.

请提供有关此的任何有用的材料.

解决方法 在OpenGL ES 2中,无论如何都要使用着色器.因此,您可以完全自由地使用您喜欢的任何纹理坐标.只需为第二个纹理coorIDnate对引入一个附加属性,并像往常一样将其委托给片段着色器:

...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,还有glTexEnv和gl(En / dis)能(GL_TEXTURE_2D)).

对于指定纹理坐标,您仍然使用glTexCoordPointer函数,与单个纹理一样,但是使用glCIEntActiveTexture(GL_TEXTUREi),您可以选择以下调用glTexCoordPointer和glEnableClIEntAttrib(GL_TEXTURE_COORD_ARRAY)的纹理单元.

所以它会是这样的:

//bind and enable texturesglActiveTexture(GL_TEXTURE1);glBindTexture(GL_TEXTURE_2D,<second texture>);glTexEnv(<texture environment for second texture>);   //maybe,if neededglEnable(GL_TEXTURE_2D);glActiveTexture(GL_TEXTURE0);glBindTexture(GL_TEXTURE_2D,<first texture>);glTexEnv(<texture environment for first texture>);   //maybe,if neededglEnable(GL_TEXTURE_2D);//set texture coordinatesglClIEntActiveTexture(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 arraysglClIEntActiveTexture(GL_TEXTURE1);gldisableClIEntState(GL_TEXTURE_COORD_ARRAY);glClIEntActiveTexture(GL_TEXTURE0);gldisableClIEntState(GL_TEXTURE_COORD_ARRAY);//disable texturesglActiveTexture(GL_TEXTURE1);gldisable(GL_TEXTURE_2D);glActiveTexture(GL_TEXTURE0);gldisable(GL_TEXTURE_2D);

我在第一个纹理之前设置第二个纹理的参数的原因只是为了在设置它们之后我们最终得到纹理单元0活动.我想我已经看到司机在绘图时遇到问题而另一个单位比单位0有效.最后在最后保留一个或多或少的干净状态总是一个好主意,这意味着默认纹理单元(GL_TEXTURE0)处于活动状态,否则不关心多纹理的代码可能会出现问题.

编辑:如果你使用立即模式(glBegin / glEnd)而不是顶点数组,那么你当然不使用glTexCoordPointer.在这种情况下,您当然也不需要glClIEntAttribTexture.您只需要使用glMultiTexCoord(GL_TEXTUREi,…)和相应的纹理单元(GL_TEXTURE0,GL_TEXTURE1,…)而不是glTexCoord(…).但是,如果我得到正确的通知,无论如何,OpenGL ES都没有立即模式.

总结

以上是内存溢出为你收集整理的ios – 具有不同紫外线标的OpenGL ES 1多纹理全部内容,希望文章能够帮你解决ios – 具有不同紫外线坐标的OpenGL ES 1多纹理所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1071180.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存