0

我被 OpenGL 中的几何着色器困住了——C++ 编程。我想通过重复 6 次绘制一个旋转的墙来创建简单的立方体。这是我的顶点着色器(每个都在序言中有#version 330核心):

uniform mat4 MVP;
uniform mat4 ROT;
layout(location=0) in vec3 vertPos;
void main(){
    vec4 pos=(MVP*ROT*vec4(vertPos,1));
    pos.x/=1.5;
    pos.y/=1.5;
    gl_Position=pos;
}

现在几何着色器:

layout (triangles) in;
layout (triangle_strip, max_vertices = 6) out;
out vec4 pos;
void main(void)
{
    pos=vec4(1,1,1,1);
    for (int i = 0; i < 3; i++)
    {
        vec4 offset=vec4(i/2.,0,0,0);
        gl_Position = gl_in[i].gl_Position+offset;
        EmitVertex();
    }
    EndPrimitive();
}

现在片段着色器:

uniform mat4 MVP;
in vec4 pos;
out vec3 color;
void main(){
    vec3 light=(MVP*vec4(0,0,0,1)).xyz;
    vec3 dd=pos.xyz-light;
    float cosTheta=length(dd)*length(dd);
    color=vec3(1,0,0);
}

好吧,有一些垃圾,我也想在我的立方体中添加阴影,但是我在发送坐标时遇到了问题。主要问题是 - 在这里我得到了我的缩放正方形(通过 MVP 矩阵),我什至可以用基本界面(ROT 矩阵)旋转它,但是当我取消注释我的“+offset”行时,我得到了一些混乱。我应该怎么做才能使清洁6次重复?

4

1 回答 1

2

看起来错误就在这里,在您的几何着色器中。

gl_Position = gl_in[i].gl_Position+offset;

这会增加一个偏移量......但它会在剪辑空间中添加偏移量,这可能不是您想要的。在顶点着色器中添加偏移量,或在几何着色器中进行透视投影。

/* Passthrough vertex shader */
layout(location=0) in vec3 vertPos;
void main(){
    gl_Position = vec4(vertPos, 1.0);
}

/* Geometry shader */
...
    gl_Position = MVP * (ROT * (gl_in[i].gl_Position + offset));
    EmitVertex();
...

另外,我注意到您的顶点着色器中有一些不寻常的地方。

pos.x/=1.5;
pos.y/=1.5;

这是不寻常的,因为它是直接跟随矩阵乘法的线性变换。将 MVP 矩阵乘以以下矩阵可能更直接:

1/1.5     0     0     0
    0 1/1.5     0     0
    0     0     1     0
    0     0     0     1

这将使用更少的着色器代码实现相同的结果。

于 2015-01-09T00:17:34.767 回答