Opengl GLSL几何体着色器问题
为了这个,我已经拔了两天的头发了 首先。。代码。。所有这些Opengl GLSL几何体着色器问题,opengl,glsl,geometry-shader,Opengl,Glsl,Geometry Shader,为了这个,我已经拔了两天的头发了 首先。。代码。。所有这些 //Leaf Vertex Shader #version 330 compatibility out vec4 VertexColor; void main(void) { gl_Position = gl_ModelViewMatrix *gl_Vertex; gl_TexCoord[0].st = gl_MultiTexCoord0.st; gl_TexCoord[1].st = gl_MultiTe
//Leaf Vertex Shader
#version 330 compatibility
out vec4 VertexColor;
void main(void)
{
gl_Position = gl_ModelViewMatrix *gl_Vertex;
gl_TexCoord[0].st = gl_MultiTexCoord0.st;
gl_TexCoord[1].st = gl_MultiTexCoord1.st;
gl_TexCoord[2].st = gl_MultiTexCoord2.st;
gl_TexCoord[3].st = gl_MultiTexCoord3.st;
gl_TexCoord[4].st = gl_MultiTexCoord4.st; // this is out size in x.y
VertexColor = gl_Color;
}
地理着色器
#version 330 compatibility
#extension GL_EXT_geometry_shader4 : enable
//uniform float uNormalsLength;
out vec2 texCoord;
out vec4 color;
layout(points) in;
layout(triangle_strip, max_vertices = 4) out;
void main(void)
{
vec4 vVertex = gl_in[0].gl_Position;
vec2 uvs[4];
uvs[0] = gl_TexCoord[0].st;
uvs[1] = gl_TexCoord[1].st;
uvs[2] = gl_TexCoord[2].st;
uvs[3] = gl_TexCoord[3].st;
vec2 scale = gl_TexCoord[4].st;
float vx[4];
vx[0] = -1.0;
vx[1] = -1.0;
vx[2] = 1.0;
vx[3] = 1.0;
float vy[4];
vy[0]= -1.0;
vy[1]= 1.0;
vy[2]= 1.0;
vy[3]= -1.0;
int indi[4];
indi[0] = 0;
indi[1] = 3;
indi[2] = 1;
indi[3] = 2;
texCoord = uvs[0];
vec4 oVertex = gl_PositionIn[0];
color = vec4(0.5, 0.5, 0.5, 1.0);
for(int i = 0; i < 4; ++i)
{
oVertex.xyz = vVertex.xyz;
color = vec4(0.0, 0.0, 0.5, 1.0);
oVertex.x += (vx[ indi[i] ] * scale.x);
oVertex.y += (vx[ indi[i] ] * scale.y);
texCoord.xy = uvs[ indi[i] ].xy;
gl_Position = gl_ModelViewProjectionMatrix * oVertex;
EmitVertex();
}
EndPrimitive();
}
当我给它一个点,我得到的只是一个点。
我已经试过发送三角图。。这没什么区别
当我检查int32返回的colorMap的gl_getuniformlocation时,它是-1
当我调用gl_useprogram时,这个程序几乎不运行。它没有效果。。我甚至不能影响颜色和。。为colorMap返回-1使我认为片段着色器从未获得任何输入。
我尝试过在顶点着色器中对顶点进行硬编码,但没有任何区别
我不确定这个变换,但是我不能测试这个,因为我只能看到一个点。就像我说的。。就好像从来没有装过子弹一样。如果我将顶点作为三角形带发送,我会在屏幕上看到三角形带。
感谢所有花时间阅读本文的人
对不起,所有的代码,但也许有人可以发现我遗漏了什么。
也。。其中有很多不推荐的东西,但在我的其他着色器中从来没有出现过问题 好的,我会尽量指出你做的所有错误的事情。但是,由于这段代码有太多的错误,我可能无法完全理解
#extension GL_EXT_geometry_shader4 : enable
GL 3.2中的core与EXT_geometry_shader4功能之间的交互没有很好的定义。因此,这条线到底会做什么还不得而知
应删除此行以及与之相关的任何代码。例如,输入变量gl\u PositionIn
由EXT\u geometry\u shader4定义,而不是由core GS定义。奇怪的是,您确实使用了该值,但由于某种原因,您在循环的第一步立即覆盖了它
uvs[0] = gl_TexCoord[0].st;
uvs[1] = gl_TexCoord[1].st;
uvs[2] = gl_TexCoord[2].st;
uvs[3] = gl_TexCoord[3].st;
vec2 scale = gl_TexCoord[4].st;
无论您将其放入哪个着色器阶段,gl_TexCoord
始终引用该阶段的输出。永远不要忘记输入。因此,您正在复制从未写入的着色器阶段输出变量的值
正确的输入变量名应该是[0].gl\u TexCoord[x]中的gl\u
检查是否在GS中读取输入变量的最简单方法是:是否必须使用数组索引作为输入变量的前缀/后缀?如果没有,那么它就不是一个输入变量。所有几何体着色器输入变量都是阵列的
gl_Position = gl_ModelViewProjectionMatrix * oVertex;
在顶点着色器中,通过gl\u ModelViewMatrix
变换输出位置。它将位置从模型空间转换为摄影机/眼睛/视图空间(无论您如何称呼它)。所以这些位置现在是相对于相机的
gl\u ModelViewProjectionMatrix
将位置从模型空间转换到投影空间。如果您的位置在摄影机空间中(正如前面所确定的,它们是),那么这种转换是毫无意义的
这里要使用的正确矩阵是gl\u ProjectionMatrix
,它从摄影机空间转换到投影空间
这就是功能代码的样子。使用OpenGL 3.3核心配置文件的代码
顶点着色器:
#version 330 core
in vec4 position;
in vec4 color;
in vec2 texCoords[4]; //Yes, that's perfectly legal.
in vec2 scaleFactor;
out VS
{
out vec4 color;
out vec2 texCoords[4]; //Yes, this is legal too.
out vec2 scaleFactor;
} dest;
//The transformation from model space to camera space.
uniform mat4 modelToCamera;
void main(void)
{
gl_Position = modelToCamera * position;
dest.color = color;
for(int i = 0; i < texCoord.length(); ++i)
dest.texCoord[i] = texCoord[i];
dest.scaleFactor = scaleFactor;
}
好的,我会尽量指出你做的所有错误的事情。但是,由于这段代码有太多的错误,我可能无法完全理解
#extension GL_EXT_geometry_shader4 : enable
GL 3.2中的core与EXT_geometry_shader4功能之间的交互没有很好的定义。因此,这条线到底会做什么还不得而知
应删除此行以及与之相关的任何代码。例如,输入变量gl\u PositionIn
由EXT\u geometry\u shader4定义,而不是由core GS定义。奇怪的是,您确实使用了该值,但由于某种原因,您在循环的第一步立即覆盖了它
uvs[0] = gl_TexCoord[0].st;
uvs[1] = gl_TexCoord[1].st;
uvs[2] = gl_TexCoord[2].st;
uvs[3] = gl_TexCoord[3].st;
vec2 scale = gl_TexCoord[4].st;
无论您将其放入哪个着色器阶段,gl_TexCoord
始终引用该阶段的输出。永远不要忘记输入。因此,您正在复制从未写入的着色器阶段输出变量的值
正确的输入变量名应该是[0].gl\u TexCoord[x]
中的gl\u
检查是否在GS中读取输入变量的最简单方法是:是否必须使用数组索引作为输入变量的前缀/后缀?如果没有,那么它就不是一个输入变量。所有几何体着色器输入变量都是阵列的
gl_Position = gl_ModelViewProjectionMatrix * oVertex;
在顶点着色器中,通过gl\u ModelViewMatrix
变换输出位置。它将位置从模型空间转换为摄影机/眼睛/视图空间(无论您如何称呼它)。所以这些位置现在是相对于相机的
gl\u ModelViewProjectionMatrix
将位置从模型空间转换到投影空间。如果您的位置在摄影机空间中(正如前面所确定的,它们是),那么这种转换是毫无意义的
这里要使用的正确矩阵是gl\u ProjectionMatrix
,它从摄影机空间转换到投影空间
这就是功能代码的样子。使用OpenGL 3.3核心配置文件的代码
顶点着色器:
#version 330 core
in vec4 position;
in vec4 color;
in vec2 texCoords[4]; //Yes, that's perfectly legal.
in vec2 scaleFactor;
out VS
{
out vec4 color;
out vec2 texCoords[4]; //Yes, this is legal too.
out vec2 scaleFactor;
} dest;
//The transformation from model space to camera space.
uniform mat4 modelToCamera;
void main(void)
{
gl_Position = modelToCamera * position;
dest.color = color;
for(int i = 0; i < texCoord.length(); ++i)
dest.texCoord[i] = texCoord[i];
dest.scaleFactor = scaleFactor;
}
您是如何将颜色贴图
传递给着色器的?您没有检查着色器是否已编译和链接。因为我在其中看到了几个编译错误。而且。。。很多普遍的困惑(比如你需要在GLSL 3.30上启用可怕的GL\u EXT\u geometry\u shader4
扩展,它具有核心的GS功能)。。。这段代码到底想做什么?我不太擅长这个着色器业务,但我想学习并优化我的代码。我同意。。有更好的方法可以做到这一点,但在现阶段。。我只想让它工作,当我叫它的时候,它被忽略了。我离开了“糟糕透了”。。它可以像你说的那样被移除。对它编译所有着色器并链接程序,没有错误。。我甚至在不同的位置检查glGetError,看看是否发生了一些奇怪的事情。没有错误。。这是要做的是使用一个四边形来渲染树上的叶子。至于如何传递颜色贴图,我使用Gl.glActiveTexture(Gl.Gl_TEXTURE0)Gl.glBindTexture(Gl.Gl_TEXTURE_2D,Trees.flora(i).branch_TEXTURE