OpenGL顶点着色器转换和输出

标签 opengl glsl vertex-shader

我有一个简单的顶点着色器

#version 330 core

uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;
uniform mat4 modelMatrix;

in vec3 in_Position;

out vec3 pass_Color;

void main(void)
{             
    //gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(in_Position, 1.0);
    gl_Position = vec4(in_Position, 1.0);
    pass_Color = vec3(1,1,1);    
}

在我的客户端代码中

    glm::vec4 vec1(-1,-1,0,1);//first
    glm::vec4 vec2(0,1,0,1);//second
    glm::vec4 vec3(1,-1,0,1);//third
    glm::mat4 m = projectionMatrix * viewMatrix * modelMatrix;  

    //translate on client side
    vec1 = m * vec1;
    vec2 = m * vec2;
    vec3 = m * vec3;

    //first vertex
    vertices[0] = vec1.x;
    vertices[1] = vec1.y;
    vertices[2] = vec1.z;
    //second
    vertices[3] = vec2.x;
    vertices[4] = vec2.y;
    vertices[5] = vec2.z;
    //third
    vertices[6] = vec3.x;
    vertices[7] = vec3.y;
    vertices[8] = vec3.z;

现在我的问题是,如果我在着色器中不使用矩阵乘法,并且在客户端代码中也不使用矩阵乘法,这将呈现一个漂亮的三角形,它延伸整个屏幕,所以我将其顶点着色器映射坐标以坐标形式提供给屏幕具有 x=-1..1y=-1..1

的系统

如果我在着色器中进行矩阵乘法,一切都会很好。但是,如果我像所示注释掉着色器中的代码并在客户端上执行此操作,我会得到奇怪的结果。它不应该产生相同的结果吗?

我是否错误地认为顶点着色器 gl_Position 的输出是 2D 坐标,尽管它是 vec4

感谢您的帮助。我真的很想了解顶点着色器的输出在顶点位置方面到底是什么。

最佳答案

问题出在你的着色器中,因为它只接受 3 个位置分量。如果第四个坐标尚未在投影空间中,则可以将第四个坐标设置为 1(就像您所做的那样)。

当您在客户端空间中进行转换时,结果是正确的 4 分量齐次向量。您只需在顶点着色器中按原样使用它们即可:

in vec4 in_Position.
...
gl_Position = in_Position.

关于OpenGL顶点着色器转换和输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5580627/

相关文章:

c++ - 没有任何 vbo 输入的顶点着色器输出

c++ - 我对 glBindTexture 的使用有什么问题?

opengl - 如何在glsl中计算gl_FragCoord

c++ - 通过统一缓冲区对象发送到 GLSL 的数据泄漏到其他绘制调用中 (OpenGL 3.2)

opengl - 如何仅在特定矩形区域内更改纹理中的纹素?

winapi - 在没有 vsync 的情况下与监视器刷新同步

OpenGL/JOGL : Multiple triangle fans in a vertex array

opengl - 在 OpenGL 顶点着色器中,w 是什么,为什么要除以它?

textures - WebGL:顶点着色器中的纹理访问?

c++ - GLSL无法编译没有插值的着色器(平面)