C++;,OpenGL-几何体着色器 我在OpenGL C++编程中遇到了几何着色器。我想通过重复6次绘制一个旋转的墙来创建简单的立方体。这是我的顶点着色器(everyting在前言中有#版本330 core):
现在,几何体着色器:C++;,OpenGL-几何体着色器 我在OpenGL C++编程中遇到了几何着色器。我想通过重复6次绘制一个旋转的墙来创建简单的立方体。这是我的顶点着色器(everyting在前言中有#版本330 core):,c++,opengl,geometry-shader,C++,Opengl,Geometry Shader,现在,几何体着色器: 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_P
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();
}
嗯,有一些垃圾,我还想在我的立方体中添加阴影,但我在发送坐标时遇到了问题。主要的问题是-这里我得到了我的缩放正方形(通过MVP矩阵),我甚至可以用基本界面(ROT矩阵)旋转它,但是当我取消注释我的“+偏移”行时,我得到了一些混乱。我应该怎么做才能使干净重复6次?看起来错误就在这里,在您的几何体着色器中
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();
...
这将添加一个偏移量。。。但它会在剪辑空间中添加偏移,这可能不是您想要的。在顶点着色器中添加偏移,或在几何体着色器中执行透视投影
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
这将用更少的着色器代码实现相同的结果。没有什么私人问题,但请缩进您的代码LOL,即使我的朋友也这么说。我有特殊的脚本来删除代码中的所有缩进,我喜欢干净。真的吗?这一点都不干净!你只是不明白我的方式:(真的不确定你现在是否在玩,但可能是的。尝试删除所有的换行符,这会很漂亮。我现在给你解决了的标记,但我必须检查这个代码。谢谢!嗯,我想这只是如何使我的代码更简单的建议,但我仍在等待最终解决;)还有,我发现,通过键入gl_Position=vec4(vertPos,1.5),可以在顶点着色器中简单地调整向量的大小;