【问题标题】:Alternative to gl_TexCoord.xy to get texture coordinate替代 gl_TexCoord.xy 获取纹理坐标
【发布时间】:2019-12-06 03:49:22
【问题描述】:

我总是在 glsl 3 中制作我的着色器(使用 #version 330 行),但它已经开始很老了,所以我最近尝试在 glsl 4 中制作一个着色器,并将它与用于渲染的 SFML 库,而不是纯粹的 openGL。
目前,我的目标是为 2d 游戏做一个基本的着色器,它获取纹理每个像素的颜色并修改它们。我总是用gl_TexCoord[0].xy 这样做,但它现在似乎贬值了,所以我搜索并听说我必须将 inout 变量与顶点着色器一起使用,所以我尝试了。

片段着色器

#version 400

in vec2 fragCoord;

out vec4 fragColor;

uniform sampler2D image;

void main(){

    // Get the color
    vec4 color = texture( image, fragCoord );

    /*
     * Do things with the color
     */

    // Return the color
    fragColor = color;
}

 
顶点着色器

#version 400

in vec3 position;
in vec2 textureCoord;

out vec2 fragCoord;

void main(){

    // Set the position of the pixel and vertex (I guess)
    fragCoord = textureCoord;
    gl_Position = vec4( position, 1.0 );
}

我还看到我们可以添加投影、模型和视图矩阵,但我不知道如何使用 SFML(我什至不认为我们可以),我不想学习关于 openGL 或 SFML 的一些复杂事情只是为了改变 2d 游戏的一些颜色,所以这是我的问题:

有没有一种简单的方法来获取我们正在处理的像素的坐标?也许摆脱顶点着色器,或者在不使用矩阵的情况下使用它?

【问题讨论】:

    标签: c++ opengl glsl sfml


    【解决方案1】:

    除非你真的想学习很多讨厌的 OpenGL,否则只为纹理编写自己的着色器有点过头了。 SFML 可以在幕后为您处理纹理和着色器(here 是一篇关于如何使用它们的好文章),因此您根本无需担心着色器。另请注意,您可以使用sprite.setColor(sf::color(*whatever*)); 更改 SFML 精灵的颜色(我相信,这就是您想要做的)。另外,使用version 330 也没有问题。这就是我通常使用的,尽管inout 的东西也是如此。

    如果您真的想使用自己的着色器来实现花哨的效果,例如像素化、模糊等。我无法为您提供太多帮助,因为我只使用过纯 OpenGl,所以我不知道顶点如何信息由 SFML 处理,但 this 是一些有趣的示例代码,您可以查看,here 是教程,here 是参考。

    更直接地回答您的问题。 gl_FragCoord 是 GLSL 的内置变量,用于跟踪片段位置,但您必须在顶点着色器中设置 gl_Position。如果你正在做任何与 OpenGL 相关的事情,你就无法摆脱顶点着色器。你必须做一些花哨的矩阵的东西(this 是一个很棒的库),可能还有缓冲的东西(like this)来告诉 GLSL 自己在哪里。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-02
      • 1970-01-01
      • 1970-01-01
      • 2018-11-20
      • 1970-01-01
      • 2012-05-04
      • 2011-07-26
      • 1970-01-01
      相关资源
      最近更新 更多