0

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

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

gif

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

我试图实现我可以四处移动,并且纹理将根据面和顶点保持它的位置、旋转和缩放,而不是像现在这样根据相机。

这是所需的结果,尽管使用了不推荐使用的方法glVertex2fglTexCoord2f这与我通过着色器想要的结果相同,我想我的问题是计算纹理上的正确 UV 坐标。

期望的结果
(来源:gyazo.com

重要的是,我想使用着色器来实现这一点,这样我就可以对实际纹理的颜色进行/计算更改。(例如将其设为黑白)。

这是我当前的顶点和片段着色器代码。

顶点着色器代码

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;草纹理本身。

4

1 回答 1

2

它这样做是因为这就是你编程的原因。您直接从片段的坐标派生 texcoords。如果您希望纹理“坚持几何”,则需要定义几何和纹理空间之间的映射。通常,这是通过每个顶点的 2D 纹理坐标属性完成的 - 就像固定功能管道对glTexCoord2f()您提到的那样。

在您的特定情况下,(假设主机程序仍然指定 texcoords 与您用于顶点位置的相同方式gl_Vertex),您可以让 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 版本。

于 2013-08-10T18:17:50.287 回答