c++ - 片段着色器中的 GLSL 翻译未按预期工作

标签 c++ opengl glsl shader fragment-shader

我编写了一个简单的 GLSL 着色器,它创建的图案类似于 this 上显示的彩色方 block 图案。页。然后我添加了代码,按照this在屏幕上移动图案。例子。这是我的代码:

st = vec3(TexCoord.x , TexCoord.y , 0.0);
vec3 translate = vec3(cos(u_time),sin(u_time), 0.0);
st+= translate * 0.1;
st = fract(st * 10);

color = vec3(st.x,st.y,1.0);

一切正常,图案绕原点做圆周运动。当我想在不使用 u_time 的情况下移动纹理时,就会出现问题。如果我想将纹理在 x 方向移动 5 个单位,在 y 方向移动 2 个单位。我尝试了以下代码:

st = vec3(TexCoord.x , TexCoord.y , 0.0);
vec3 translate = vec3(5,2, 0.0); //This line is different
st+= translate * 0.1;
st = fract(st * 10);

color = vec3(st.x,st.y,1.0);

但是当我这样做时,纹理根本不会移动,并且使用更大的值只会拉伸(stretch)纹理的方向(如果 x = 5000000,纹理会在 x 方向上拉伸(stretch))。

我的问题是为什么会发生这种情况以及如何纠正它?

亲切的问候。

最佳答案

您需要将纹理坐标移动 < 1.0 的偏移量:

vec3 翻译 = vec3(5,2, 0.0);

vec3 translate = vec3(0.5, 0.2, 0.0);

纹理坐标的范围是[0.0, 1.0]。将纹理平移 1 的整数倍与将纹理平移 0.0 具有相同的效果。
请注意,sincos 函数的结果在 [-1.0, 1.0] 范围内。

关于c++ - 片段着色器中的 GLSL 翻译未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65157114/

相关文章:

opengl - 无法获取指定着色器类型的子例程信息

opengl - 如何在不创建窗口的情况下检查 OpenGL 和 GLSL 版本?

c++ - 如何将函数指针传递给绑定(bind)?

c++ - 有没有办法在 Visual C++ 调试后返回以前的状态?

c - 需要帮助理解颜色映射算法

c++ - 错误 : 'GL/glfw3.h: No such file or directory' when compiling C++ programs using OpenGL on Linux

c++ - 使用着色器渲染时 OpenGL 纹理全黑

c++ - 从 C++ 中的文本文件中读取带有杂散空格的逗号分隔值

c++ - 具有多个数组的类的构造函数初始化列表(C++11 可以,boost 和 std::vector 不行)

opengl - 这些矩阵模式有什么区别?