替代gl_texcoord.xy获得纹理坐标

Alternative to gl_TexCoord.xy to get texture coordinate

本文关键字:纹理 坐标 xy gl texcoord 替代      更新时间:2023-10-16

我总是在glsl 3(带有 #version 330 line(中制作着着色器在GLSL 4中,并将其与SFML库一起渲染,而不是纯opengl。
就目前而言,我的目标是为2D游戏做一个基本的着色器,该游戏会采用纹理的每个像素的颜色并修改它们。我总是用 gl_TexCoord[0].xy做到这一点,但是现在似乎已经折旧了,所以我搜索了,我听说我必须在和 out out 变量中使用certex着色器,所以我尝试了。

片段着色器

#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游戏中更改一些颜色,所以这是我的问题:

是否有一种简单的方法可以使我们正在处理的像素的坐标?也许摆脱顶点着色器,或者不使用矩阵而不使用它?

,除非您真的想学习很多令人讨厌的OpenGL,否则为纹理编写自己的着色器是有点过分的。SFML可以在幕后为您处理纹理和着色器(这是有关如何使用它们的好文章(,因此您根本不必担心着色器。另请注意,您可以使用sprite.setColor(sf::color(*whatever*));更改SFML Sprites的颜色(我相信您正在尝试做什么(。另外,使用version 330没有问题。这就是我通常使用的,尽管还有inout的东西。

如果您真的想使用自己的着色器来进行精美的效果,例如像素化,模糊等。我无济于事,因为我只使用过纯opengl,所以我不知道pertex如何信息由SFML处理,但这是您可以签出的一些有趣的示例代码,这是一个教程,这里是参考。

更直接地回答您的问题。gl_FragCoord是带有GLSL的内置变量,可以跟踪片段位置,但是您必须在顶点着色器中设置gl_Position。如果您正在做任何与OpenGL相关的事情,则无法摆脱顶点着色器。您必须做精美的矩阵工作(这是一个很棒的图书馆(,并且可能(像这样(来告诉GLSL一切都在哪里。