Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl GLSL几何体着色器问题_Opengl_Glsl_Geometry Shader - Fatal编程技术网

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