2015-01-08 161 views
0

我被几何着色器卡在OpenGL-C++编程中。我想通过重复6次绘制一个旋转的墙来创建简单的立方体。这里是我的顶点着色器(everyting在序言的#Version 330核心):C++,OpenGL - 几何着色器

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矩阵)旋转它,但是当我取消注释我的“+偏移”线时,我得到一些混乱。我应该怎样做6次重复清洁?

+1

没有什么个人的,但请INDENT您的代码 – MightyPork

+0

大声笑,甚至我的朋友都这样说。我有特殊的脚本来删除我的代码中的所有缩进,我喜欢它干净。 –

+1

真的吗?这是一切*但干净! – MightyPork

回答

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 

这将实现以较少的着色器代码相同的结果。

+0

现在我给你解决问题的标记,但是我必须检查这个代码。谢谢! –

+0

Ehm,我想这只是建议如何使我的代码更简单,但我仍然等待最后的精神;) –

+0

此外,我发现调整我的矢量可以简单地在顶点着色器中完成键入gl_Position = vec4(vertPos,1.5 ); –