着色器纹理总是面对相机

时间:2013-08-10 17:40:24

标签: opengl glsl shader fragment-shader vertex-shader

我有这个基本的着色器,虽然我遇到了一些麻烦但真的让我烦恼!

我正在使用片段着色器应用纹理但是我移动或旋转相机时,脸部的纹理将始终面向相机(我添加了GIF图像作为示例)。

gif

因此,正如您在上面的图像上看到的那样,纹理始终面向相机,如果我离得更近,它也会保持其比例。

我正在努力实现我可以四处移动,纹理将根据面部和顶点保持其位置,旋转和缩放,而不是像现在一样根据相机。

这是理想的结果,虽然使用了不推荐使用的方法glVertex2fglTexCoord2f,但我想通过着色器获得相同的结果,我想我的问题是计算正确的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;当然是草纹本身。

1 个答案:

答案 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版本。