我有这个基本的着色器,虽然我遇到了一些麻烦但真的让我烦恼!
我正在使用片段着色器应用纹理但是我移动或旋转相机时,脸部的纹理将始终面向相机(我添加了GIF图像作为示例)。
因此,正如您在上面的图像上看到的那样,纹理始终面向相机,如果我离得更近,它也会保持其比例。
我正在努力实现我可以四处移动,纹理将根据面部和顶点保持其位置,旋转和缩放,而不是像现在一样根据相机。
这是理想的结果,虽然使用了不推荐使用的方法glVertex2f
和glTexCoord2f
,但我想通过着色器获得相同的结果,我想我的问题是计算正确的UV坐标在纹理上。
desired result http://gyazo.com/25dd5c7261953c9e05d7b19f37361c18.png
重要我想使用着色器实现此功能,以便我可以对实际纹理的颜色进行/计算更改。 (例如,使它成为黑色和白色)。
这是我目前的顶点&片段着色器代码。
void main() {
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
uniform vec2 size;
uniform sampler2D texture;
void main() {
gl_FragColor = texture2D(texture, gl_FragCoord.xy / size.xy);
}
片段着色器中的uniform vec2 size;
是应用纹理的面本身的宽度和高度。 uniform sampler2D texture;
当然是草纹本身。
答案 0 :(得分:2)
这样做是因为那是你编程的。您可以直接从片段的坐标派生texcoords。如果希望纹理“粘贴到几何体”,则需要在几何体和纹理空间之间定义映射。通常,这是通过每个顶点的2D纹理坐标属性完成的 - 正如固定函数管道对您提到的glTexCoord2f()
所做的那样。
在您的特定情况下,(假设主程序仍然使用与gl_Vertex
的顶点位置相同的depøaed方式指定texcoords),您可以让GL插入每个片段的texcoords并使用它们来访问片段着色器中的纹理:
顶点着色器代码
varying vec2 vTexCoord;
void main() {
vTexCoord = gl_MultiTexCoord0.st;
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
片段着色器代码
uniform sampler2D texture;
varying vec2 vTexCoord;
void main() {
gl_FragColor = texture2D(texture, vTexCoord);
}
我建议切换到通用顶点属性,以及更现代的GLSL版本。