【问题标题】:Vertex Shader for a Particle System粒子系统的顶点着色器
【发布时间】:2015-11-02 22:38:29
【问题描述】:

我正在使用 OpenGL 开发一个简单的粒子系统;到目前为止,我已经编写了两个片段着色器来更新速度和位置以响应我的鼠标,它们似乎工作!我查看了这两个纹理,它们似乎都能正确响应(从随机噪声变为有序结构以响应我的鼠标)。

但是,我遇到了如何绘制粒子的问题。我对顶点着色器比较陌生(以前只使用过片段着色器);据我了解,通常的方式是这样的顶点着色器:

uniform sampler2DRect tex;
varying vec4 cur;

void main() {
    gl_FrontColor = gl_Color;
    cur = texture2DRect(tex, gl_Vertex.xy);
    vec2 pos = cur.xy;
    gl_Position = gl_ModelViewProjectionMatrix * vec4(pos, 0., 1.);
}

会根据位置缓冲区中的值将坐标转换到适当的位置。但是,当我运行它时遇到无法编译的 gl 错误——经过一些研究,似乎 gl_ModelViewProjectionMatrix 已被弃用。

既然不推荐使用模型视图矩阵,那么正确的方法是什么?我并不想用透视做任何花哨的事情,我只需要一个简单的纹理正交视图。

谢谢!

【问题讨论】:

  • 如果您只需要一个普通的正交视图,为什么要使用矩阵?
  • 仅设置 gl_Position = vec4(pos, 0., 1.); 似乎不起作用——尽管我认为如果这应该是正确的,这可能是片段着色器问题!

标签: c++ glsl fragment-shader vertex-shader


【解决方案1】:

您使用的是什么版本的 GLSL(没有看到任何 #version 指令)?是的,我认为gl_ModelViewProjectionMatrix 真的被弃用了。但是,如果您想使用它,this 可能会有所帮助。顺便说一句,varying 限定词也很老了。我宁愿使用inout 限定符,它使你的着色器代码更“可读”。

“正确”的做法是创建自己的矩阵 - 模型和视图(例如使用 glm 库)并将它们相乘,然后将它们作为统一传递给着色器。可以找到带有示例的教程here

这是我用于显示纹理的 vs 着色器(全屏四边形):

#version 430

layout(location = 0) in vec2 vPosition;
layout(location = 1) in vec2 vUV;

out vec2 uv;

void main()
{
    gl_Position = vec4(vPosition,1.0,1.0);
    uv = vUV;
}

片段着色器:

#version 430

in vec2 uv;
out vec4 final_color;
uniform sampler2D tex;

void main()
{
    final_color = texture(tex, uv).rgba;
}

这是我的坐标(我的坐标是静态的,但您可以更改它并更新缓冲区 - 着色器可以相同):

//Quad verticles - omitted z coord, because it will always be 1
float pos[] = {
    -1.0, 1.0,
    1.0, 1.0,
    -1.0, -1.0,
    1.0, -1.0
};

float uv[] = {
    0.0, 1.0,
    1.0, 1.0,
    0.0, 0.0,
    1.0, 0.0
};

也许您可以在执行此着色器之前尝试关闭深度比较glDisable(GL_DEPTH_TEST);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    • 1970-01-01
    • 2013-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多