在OpenGL ES 2.0中使用glTexGen
我一直试图用GL_OBJECT_LINEAR实现glTexGen的GLSL替换几个小时。 对于OpenGL ES 2.0。 在Ogl GLSL中有gl_TextureMatrix,这使得它更容易,但这在OpenGL ES 2.0 / OpenGL ES Shader Language 1.0中不可用
有几个网站提到,在GLSL垂直着色器中这应该是“容易的”。 但我无法让它工作。
我的直觉是,我没有正确地设置飞机,或者我在理解中错过了一些东西。
我在网上看到了。 但大多数网站都在谈论投影纹理,我只是想在平面投影的基础上创建UV。 这些模型正在玛雅建造,有五万多个多边形,建模者使用平面图,但Maya不会输出UV。 所以我想弄明白这一点。
我查看了glTexGen手册页信息:
g = p1xo + p2yo + p3zo + p4wo
什么是g? g是texture2d调用中s的值吗?
我看过这个网站:
http://www.opengl.org/wiki/Mathematics_of_glTexGen
另一个大小解释了相同的功能:
坐标= P1 * X + P2 * Y + P3 * Z + P4 * W
我不明白coord(我脑海中的UV vec2)等于点积(一个标量值)吗? 同样的问题,我以前用“g”。
我该如何设置飞机? 在我的opengl c ++ 3.0代码中,我将它设置为[0,0,1,0](基本上单位为z),并且glTexGen工作得很好。
我仍然错过了一些东西。
我的垂直着色器看起来基本上是这样的:WVPMatrix = World View Project Matrix。 POSITION是模型的顶点位置。
varying vec4 kOutBaseTCoord; void main() { gl_Position = WVPMatrix * vec4(POSITION, 1.0); vec4 sPlane = vec4(1.0, 0.0, 0.0, 0.0); vec4 tPlane = vec4(0.0, 1.0, 0.0, 0.0); vec4 rPlane = vec4(0.0, 0.0, 0.0, 0.0); vec4 qPlane = vec4(0.0, 0.0, 0.0, 0.0); kOutBaseTCoord.s = dot(vec4(POSITION, 1.0), sPlane); kOutBaseTCoord.t = dot(vec4(POSITION, 1.0), tPlane); //kOutBaseTCoord.r = dot(vec4(POSITION, 1.0), rPlane); //kOutBaseTCoord.q = dot(vec4(POSITION, 1.0), qPlane); }
碎片着色器
precision mediump float; uniform sampler2D BaseSampler; varying mediump vec4 kOutBaseTCoord; void main() { //gl_FragColor = vec4(kOutBaseTCoord.st, 0.0, 1.0); gl_FragColor = texture2D(BaseSampler, kOutBaseTCoord.st); }
我已经尝试了frag着色器中的texture2DProj
以下是我查阅的其他一些链接
http://www.gamedev.net/topic/407961-texgen-not-working-with-glsl-with-fixed-pipeline-is-ok/
先谢谢你。
来自glTexGen文档::
void glTexGenfv ( GLenum coord , GLenum pname , const GLfloat *params );
g = p1 xo + p2 yo + p3 zo + p4 wo
被使用,其中g是为在coord中命名的坐标计算的值,...
所以g的确是一个标量值,它可以是vec2 uv值的s或t分量,取决于coord的值(GL_S或GL_T)。
更明确地说,呼叫
glTexGen(GL_S, GL_OBJECT_LINEAR, {ps0,ps1,ps2,ps3})
glTexGen(GL_T, GL_OBJECT_LINEAR, {pt0,pt1,pt2,pt3})
类似于
vec4 sPlane = vec4(ps0,ps1,ps2,ps3);
vec4 tPlane = vec4(pt0,pt1,pt2,pt3);
kOutBaseTCoord.s = dot(vec4(POSITION, 1.0), sPlane);
kOutBaseTCoord.t = dot(vec4(POSITION, 1.0), tPlane);
根据POSITION值的比例,输出的st坐标可能在(0,1)范围之外。 使用你的价值观:
vec4 sPlane = vec4(1.0, 0.0, 0.0, 0.0);
vec4 tPlane = vec4(0.0, 1.0, 0.0, 0.0);
将直接将模型顶点的x坐标映射到纹理坐标的s值,对于y和t也是如此。 因此,如果您的模型的坐标范围在(0,1)之外,则会出现UV值。
为了使纹理适合您的模型,您必须将投影的比例调整为模型的大小。 对于100.0的示例模型大小,这将给出以下代码:
float MODEL_SIZE = 100.0;
vec4 sPlane = vec4(1.0/MODEL_SIZE, 0.0, 0.0, 0.0);
vec4 tPlane = vec4(0.0, 1.0/MODEL_SIZE, 0.0, 0.0);
如果您的模型以(0,0,0)为中心,此解决方案仍然可以为您提供<0的值。 为了调整这一点,你可以为产生的UV值添加一个偏移量。 如 :
kOutBaseTCoord.st += vec(0.5);
请注意,所有这些都依赖于应用程序,以及您尝试使用纹理投影实现的功能。 不要犹豫,调整你的公式来满足你的需求,这就是着色器的作用!
链接地址: http://www.djcxy.com/p/33595.html