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 更新顶点着色器(glVertexAttrib3f)中作为glVertex使用的属性变量_Opengl_Shader_Fragment Shader_Vertex Shader_Geometry Shader - Fatal编程技术网

Opengl 更新顶点着色器(glVertexAttrib3f)中作为glVertex使用的属性变量

Opengl 更新顶点着色器(glVertexAttrib3f)中作为glVertex使用的属性变量,opengl,shader,fragment-shader,vertex-shader,geometry-shader,Opengl,Shader,Fragment Shader,Vertex Shader,Geometry Shader,我在使用属性变量获取顶点着色器中的值时遇到问题。我想为几何体着色器提供上一个基本体(线)中的一个点,以便进行一些计算。我在顶点着色器中使用一个vec3属性变量(Ppoint),然后在顶点着色器中使用一个out变量,在几何体着色器(pointPass)中使用一个in变量,来提供这一点 问题在于,当我在绘制线的同时更新glBegin()/glEnd()块中的属性变量时,glVertexAttrib3f中的值被视为顶点,并且还会向这些点渲染一条线。这会导致显示一些额外的行,并且所有几何体着色器功能都会

我在使用属性变量获取顶点着色器中的值时遇到问题。我想为几何体着色器提供上一个基本体(线)中的一个点,以便进行一些计算。我在顶点着色器中使用一个vec3属性变量(Ppoint),然后在顶点着色器中使用一个out变量,在几何体着色器(pointPass)中使用一个in变量,来提供这一点

问题在于,当我在绘制线的同时更新glBegin()/glEnd()块中的属性变量时,glVertexAttrib3f中的值被视为顶点,并且还会向这些点渲染一条线。这会导致显示一些额外的行,并且所有几何体着色器功能都会受到干扰

这是我所有着色器的代码和绘制线条的opengl程序

顶点着色器

#version 330 compatibility
out vec3 pointPass;
attribute vec3 Ppoint;
void main()
{ 
    pointPass = Ppoint;
    gl_Position = gl_Vertex;
}
几何体着色器

#version 330 compatibility
in vec3 pointPass[]; 
out vec4 colorFrag; 
layout(lines) in;
// 100 vertices are not actually required specified more for trial
layout(triangle_strip, max_vertices=100) out;

vec3 getA(vec3 axis){ 
    vec3 a; 
    a.x = 1.0;
    a.y = 1.0; 
    a.z = -(axis.x + axis.y)/axis.z; 
    a = normalize(a); 
    return a;
}
vec3 getB(vec3 axis, vec3 a){ 
    vec3 b;
    b.x = (a.y*axis.z - a.z*axis.y);
    b.y = (a.z*axis.x - a.x*axis.z);
    b.z = (a.x*axis.y - a.y*axis.x );
    b = normalize(b);
    return b;
}

void main()
{ 
    vec3 axis0, axis1, v0, v1, v2; 
    float radius = 0.5;
    float rotation = 0.0f;
    float pi = 3.1416; 
    int numPoints = 15;
    vec3 p1, p2, p3, p4;
    int count = 0, i;
    float increment = 2*pi/numPoints;
    v0 = pointPass[0];
    v1 = gl_in[0].gl_Position.xyz;
    v2 = gl_in[1].gl_Position.xyz;

    axis1 = v1 - v2;
    axis1 = normalize(axis1);
    vec3 a1 = getA(axis1);
    vec3 b1 = getB(axis1, a1);

    axis0 = v0-v2;
    axis0 = normalize(axis0);
    vec3 a0 = getA(axis0);
    vec3 b0 = getB(axis0, a0);

    // Rotation with theta
    for(rotation = 0; rotation<=2*pi; rotation+=increment){

    p1 = v1 + radius*cos(rotation)*a0 + radius*sin(rotation)*b0; 
    p2 = v1 + radius*cos(rotation + increment)*a0 + radius*sin (rotation + increment)*b0;
    p3 = v2 + radius*cos(rotation)*a1 + radius*sin(rotation)*b1; 
    p4 = v2 + radius*cos(rotation + increment)*a1 + radius*sin(rotation + increment)*b1;
    // FIRST Triangle 
    // FIRST vertex 
    gl_Position = (gl_ModelViewProjectionMatrix*vec4(p3,1.0) );
    EmitVertex(); 
    // SECOND vertex
    gl_Position = (gl_ModelViewProjectionMatrix*vec4(p1, 1.0) ); 
    EmitVertex();
    // THIRD vertex
    gl_Position = (gl_ModelViewProjectionMatrix*vec4(p4, 1.0) );
    EmitVertex();
    // SECOND Triangle
    // FIRST vertex 
    gl_Position = (gl_ModelViewProjectionMatrix*vec4(p2, 1.0) ); 
    EmitVertex();

    }
    EndPrimitive(); 
}
绘制直线的OpenGL程序

// vPoints is a std::vector of 3d vector class created by me.
void drawLines(){
     float angle =0.0f;
     int numLines = 30;
     int count = 0;
     float disp = 0.30f;
     float radius_x = 5.0;
     float radius_y = 5.0;
     vPoints.resize(numLines+2);
    // Loop around in a circle and specify even points along the spiral
    float increment = (float)(2*GL_PI/numLines);
    for(angle = 0.0f; angle < (2.0f*GL_PI); angle += increment)
    {   
        // Calculate x and y position of the next vertex
        float x1 = radius_x*sin(angle);
        float y1 = radius_y*cos(angle);
        float z1 = count*disp;
        vPoints[count].SetVector(x1, y1, z1);
        count ++;
    }

    // Drawing only first two line segments for testing
    glBegin(GL_LINES);
        int pointPassLocation = glGetAttribLocation(programID, "Ppoint");
      // This is also considered as a vertex and a line is drawn from this point to  vPoints[1]
        glVertexAttrib3f(pointPassLocation, vPoints[0].GetX(), vPoints[0].GetY(), vPoints[0].GetZ());

        glVertex3d(vPoints[1].GetX(), vPoints[1].GetY(), vPoints[1].GetZ());
        glVertex3d(vPoints[2].GetX(), vPoints[2].GetY(), vPoints[2].GetZ());
        // Again this is also considered as a point and a line is drawn from vPoints[2] to this point.
        glVertexAttrib3f(pointPassLocation, vPoints[1].GetX(), vPoints[1].GetY(), vPoints[1].GetZ());

        glVertex3d(vPoints[2].GetX(), vPoints[2].GetY(), vPoints[2].GetZ());
        glVertex3d(vPoints[3].GetX(), vPoints[3].GetY(), vPoints[3].GetZ());
    glEnd();
}
//vPoints是我创建的3d vector类的std::vector。
虚线{
浮动角度=0.0f;
int numLines=30;
整数计数=0;
浮动显示=0.30f;
浮动半径_x=5.0;
浮动半径_y=5.0;
调整点的大小(numLines+2);
//在圆中循环并沿缓和曲线指定偶数点
浮动增量=(浮动)(2*GL_PI/numline);
对于(角度=0.0f;角度<(2.0f*GL\u PI);角度+=增量)
{   
//计算下一个顶点的x和y位置
浮动x1=半径×正弦(角度);
浮动y1=半径_y*cos(角度);
浮点z1=计数*显示;
点[count].SetVector(x1,y1,z1);
计数++;
}
//仅绘制用于测试的前两条线段
glBegin(GL_行);
int pointPassLocation=glGetAttriblLocation(programmaid,“Ppoint”);
//这也被视为一个顶点,并从该点到V点绘制一条线[1]
glVertexAttrib3f(pointPassLocation,vPoints[0].GetX(),vPoints[0].GetY(),vPoints[0].GetZ());
glVertex3d(vPoints[1].GetX(),vPoints[1].GetY(),vPoints[1].GetZ());
glVertex3d(vPoints[2].GetX(),vPoints[2].GetY(),vPoints[2].GetZ());
//同样,这也被视为一个点,并从V点[2]到该点绘制一条线。
glVertexAttrib3f(pointPassLocation,vPoints[1].GetX(),vPoints[1].GetY(),vPoints[1].GetZ());
glVertex3d(vPoints[2].GetX(),vPoints[2].GetY(),vPoints[2].GetZ());
glVertex3d(vPoints[3].GetX(),vPoints[3].GetY(),vPoints[3].GetZ());
格伦德();
}
因此,我不想从vPoints[1]到vPoints[2]和vPoints[2]到vPoints[3]绘制两条线,而是将两条glVertexAttrib3f语句视为顶点,得到3条有6个顶点的线


我做得对吗,还是有更好的方法或其他方法来做这件事。

那么,您的问题是希望画两条线,而不是画三条线?或者你的代码是否有效,你只是想知道是否有更好的方法来完成你正在做的事情?@bwroga代码不应该画两行以上,但它正在画。还有一个更好的方法。你能解释一下你的几何体着色器应该做什么吗?@AdityaG更好的方法是使用VBOs和
glvertexattributepointer
。@bwroga我想画一条线周围的圆柱体。我可以做到。但是,当我试图围绕线条条绘制正确连接的圆柱体时,我需要上一个顶点来正确定位圆柱体的面。所以我需要将上一个顶点传递给着色器。
// vPoints is a std::vector of 3d vector class created by me.
void drawLines(){
     float angle =0.0f;
     int numLines = 30;
     int count = 0;
     float disp = 0.30f;
     float radius_x = 5.0;
     float radius_y = 5.0;
     vPoints.resize(numLines+2);
    // Loop around in a circle and specify even points along the spiral
    float increment = (float)(2*GL_PI/numLines);
    for(angle = 0.0f; angle < (2.0f*GL_PI); angle += increment)
    {   
        // Calculate x and y position of the next vertex
        float x1 = radius_x*sin(angle);
        float y1 = radius_y*cos(angle);
        float z1 = count*disp;
        vPoints[count].SetVector(x1, y1, z1);
        count ++;
    }

    // Drawing only first two line segments for testing
    glBegin(GL_LINES);
        int pointPassLocation = glGetAttribLocation(programID, "Ppoint");
      // This is also considered as a vertex and a line is drawn from this point to  vPoints[1]
        glVertexAttrib3f(pointPassLocation, vPoints[0].GetX(), vPoints[0].GetY(), vPoints[0].GetZ());

        glVertex3d(vPoints[1].GetX(), vPoints[1].GetY(), vPoints[1].GetZ());
        glVertex3d(vPoints[2].GetX(), vPoints[2].GetY(), vPoints[2].GetZ());
        // Again this is also considered as a point and a line is drawn from vPoints[2] to this point.
        glVertexAttrib3f(pointPassLocation, vPoints[1].GetX(), vPoints[1].GetY(), vPoints[1].GetZ());

        glVertex3d(vPoints[2].GetX(), vPoints[2].GetY(), vPoints[2].GetZ());
        glVertex3d(vPoints[3].GetX(), vPoints[3].GetY(), vPoints[3].GetZ());
    glEnd();
}