Opengl 更新顶点着色器(glVertexAttrib3f)中作为glVertex使用的属性变量
我在使用属性变量获取顶点着色器中的值时遇到问题。我想为几何体着色器提供上一个基本体(线)中的一个点,以便进行一些计算。我在顶点着色器中使用一个vec3属性变量(Ppoint),然后在顶点着色器中使用一个out变量,在几何体着色器(pointPass)中使用一个in变量,来提供这一点 问题在于,当我在绘制线的同时更新glBegin()/glEnd()块中的属性变量时,glVertexAttrib3f中的值被视为顶点,并且还会向这些点渲染一条线。这会导致显示一些额外的行,并且所有几何体着色器功能都会受到干扰 这是我所有着色器的代码和绘制线条的opengl程序 顶点着色器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中的值被视为顶点,并且还会向这些点渲染一条线。这会导致显示一些额外的行,并且所有几何体着色器功能都会
#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();
}