来自 glTexGen 文档::
void glTexGenfv ( GLenum coord ,
GLenum pname , const GLfloat *params
);
-
coord- 指定纹理坐标。必须
可以是 GL_S、GL_T、GL_R 或 GL_Q 之一。
-
pname- 如果纹理生成函数是
GL_OBJECT_LINEAR,函数
g= p1 至 + p2 至 + p3 至 + p4 wo
使用,其中g是计算出的值
对于命名为的坐标coord,...
so g确实是一个标量值,可以是s or tvec2 uv 值的组成部分,具体取决于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 and 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) 为中心,则此解决方案仍然可以为您提供
kOutBaseTCoord.st += vec(0.5);
请注意,所有这些都很大程度上取决于您的应用程序以及您尝试通过纹理投影实现的目标。请毫不犹豫地调整您的公式以满足您的需求,这就是着色器的用途!