【发布时间】:2011-07-01 01:02:23
【问题描述】:
我已经尝试了几个小时来用 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 中构建的,有 50k 多边形,建模器正在使用平面贴图,但 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 = 世界观项目矩阵。 POSITION 是模型顶点位置。
改变 vec4 kOutBaseTCoord; 无效的主要() { gl_Position = WVPMatrix * vec4(POSITION, 1.0); vec4 平面 = 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); }片段着色器
精度 mediump 浮点数; 统一采样器2D BaseSampler; 不同的mediump vec4 kOutBaseTCoord; 无效的主要() { //gl_FragColor = vec4(kOutBaseTCoord.st, 0.0, 1.0); gl_FragColor = texture2D(BaseSampler, kOutBaseTCoord.st); }我在片段着色器中尝试过 texture2DProj
这是我查找的其他一些链接
http://www.gamedev.net/topic/407961-texgen-not-working-with-glsl-with-fixed-pipeline-is-ok/
提前谢谢你。
【问题讨论】:
-
我不确定你的问题是什么......你的着色器代码工作正常吗?
-
不,在垂直着色器中获取点会返回 1 之外的值。
标签: opengl-es opengl-es-2.0 opengl-to-opengles