Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 获取纹理坐标的gl_TexCoord.xy的替代方法_C++_Opengl_Glsl_Sfml - Fatal编程技术网

C++ 获取纹理坐标的gl_TexCoord.xy的替代方法

C++ 获取纹理坐标的gl_TexCoord.xy的替代方法,c++,opengl,glsl,sfml,C++,Opengl,Glsl,Sfml,我总是在glsl 3中使用着色器(使用#version 330行),但它已经开始很旧了,所以我最近尝试在glsl 4中使用着色器,并将其与SFML库一起用于渲染,而不是纯openGL。 现在,我的目标是为2d游戏做一个基本的着色器,它获取纹理的每个像素的颜色并修改它们。我总是用gl_TexCoord[0].xy来做这件事,但现在它似乎贬值了,所以我搜索了一下,听说我必须用顶点着色器来使用in和out变量,所以我尝试了。 片段着色器 #版本400 在vec2 fragCoord中; out ve

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

片段着色器

#版本400
在vec2 fragCoord中;
out vec4 fragColor;
二维图像的均匀采样;
void main(){
//得到颜色
vec4颜色=纹理(图像,fragCoord);
/*
*用这种颜色做事
*/
//返回颜色
fragColor=颜色;
}

顶点着色器

#版本400
在vec3位置;
在vec2纹理命令中;
输出vec2 fragCoord;
void main(){
//设置像素和顶点的位置(我猜)
fragCoord=纹理命令;
gl_位置=vec4(位置,1.0);
}
我还看到我们可以添加投影、模型和视图矩阵,但我不知道如何使用SFML(我甚至不认为我们可以),我不想学习openGL或SFML的一些复杂内容,只是为了在2d游戏中更改一些颜色,所以我的问题是:


有没有简单的方法来获取我们正在处理的像素的坐标?也许可以去掉顶点着色器,或者不使用矩阵就使用它?

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

如果您真的想使用自己的着色器来实现奇特的效果,如像素化、模糊等。我帮不了您多少忙,因为我只使用过纯OpenGl,所以我不知道SFML是如何处理顶点信息的,但这是一些有趣的示例代码,您可以查看,这是一个教程,也是一个参考

更直接地回答你的问题
gl_FragCoord
是带有GLSL的内置变量,用于跟踪碎片位置,但您必须在顶点着色器中设置
gl_位置
。如果您正在执行任何与OpenGl相关的操作,则无法摆脱顶点着色器。你必须做一些奇特的矩阵(这是一个很棒的库)和缓冲区(buffer)来告诉GLSL你自己所有的东西都在哪里