【问题标题】:Shader Texture Always Facing The Camera始终面向相机的着色器纹理
【发布时间】:2013-08-12 10:41:22
【问题描述】:

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

我正在使用片段着色器应用纹理,尽管我移动或旋转相机,脸上的纹理将始终面向相机(我添加了一个 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; 当然是草纹理本身。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 正如我所说,我只使用不推荐使用的方法进行测试,“不过,我建议切换到通用顶点属性和更现代的 GLSL 版本”是什么意思。 ?
    • 他的意思是在你的顶点着色器中使用glVertexAttribPointer (...) 然后in vec2 vTexCoord。而不是依赖glTexCoord2f (...),因为那是 OpenGL 的未来。在核心上下文中,没有gl_TexCoord [n].st,您必须告诉 GL 哪个属性位置对应于您的纹理坐标。
    猜你喜欢
    • 2020-02-11
    • 2022-11-06
    • 2013-01-17
    • 2013-09-17
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    • 2012-02-07
    • 2017-03-28
    相关资源
    最近更新 更多