因此,我试图创建一个任意曲线形状使用OpenGL和目前我的代码只能产生一个曲线之间的指定控制点,下面是我的OpenGL代码:
#include <GL/glut.h>
#include <stdlib.h>
GLfloat controlPoints[18][3] =
{
{0.0, 8.0, 0.0},
{ -1.5, 3.0, 0.0}, //2
{-5.5, 4.0, 0.0},
{-5.5, 4.0, 0.0},
{-2.5, 0.0, 0.0}, //4
{-6.0, -4.0, 0.0},
{-6.0, -4.0, 0.0},
{-1.5, -3.0, 0.0}, //6
{0.0, -8.0, 0.0},
{0.0, -8.0, 0.0},
{1.0, -3.0, 0.0}, //8
{6.0, -5.0, 0.0},
{6.0, -5.0, 0.0},
{3.0, 0.0, 0.0}, //10
{6.5, 4.5, 0.0},
{6.5, 4.5, 0.0},
{1.5, 3.0, 0.0}, //12
{0.0, 8.0, 0.0}
};
void init(void)
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_FLAT);
for (int i = 0; (i + 3) < 3; i += 3)
{
glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, &controlPoints[i][0]);
}
//glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, &controlPoints2[0][0]);
glEnable(GL_MAP1_VERTEX_3);
// The evaluator with a stride of 3 and an order of 4
}
void display(void)
{
int i;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1.0, 1.0, 1.0);
//draw(controlPoints);
//draw(controlPoints2);
glBegin(GL_LINE_STRIP);
{
for (int i = 0; i <= 18; i++)
{
glEvalCoord1f((GLfloat)i / 18.0);
}
}
glEnd();
glBegin(GL_LINE_STRIP);
{
for (i = 0; i < 18; i++)
{
glVertex3fv(&controlPoints[i][0]);
}
}
glEnd();
glPointSize(6.0);
glColor3f(0.0, 0.0, 1.0);
glBegin(GL_POINTS);
{
for (i = 0; i < 18; i++)
{
glVertex3fv(&controlPoints[i][0]);
}
}
glEnd();
void reshape(int w, int h)
{
glViewport(0, 0, (GLsizei)w, (GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= h)
{
glOrtho(-10.0, 10.0, -10.0 * (GLfloat)h / (GLfloat)w, 10.0 * (GLfloat)h / (GLfloat)w, -10.0, 10.0);
}
else
{
glOrtho(-10.0 * (GLfloat)h / (GLfloat)w, 10.0 * (GLfloat)h / (GLfloat)w, -10.0, 10.0, -10.0, 10.0);
}
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void keyboard(unsigned char key, int x, int y)
{
switch (key)
{
case 27:
exit(0);
break;
}
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(500, 500);
glutInitWindowPosition(100, 100);
glutCreateWindow(argv[0]);
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glutMainLoop();
return 0;
}
如何修改代码的初始化部分,以便能够在三个控制点之间生成6条曲线,总计18条?如果不可能,是否可以使用GL_LINE_STRIP完成?
下面是我当前的输出:
1条答案
按热度按时间tv6aics11#
我的建议-完全避免openGL求值器!
除了90年代的一些SGI机器外,还没有GPU供应商为它们增加硬件支持,因此它福尔斯了一个相当低效的软件实现。
不管怎样,你的代码有一些问题...
但是,控制点中存在以下问题:
看起来好像您想要一条二次曲线?(即每条曲线有3个控制点?)
但是,正如我上面所说,GL评估器很糟糕。
实际上,自己编写代码要容易得多。
一个选项是简单地镶嵌每条曲线,然后渲染 (这将与您当前的控制点布局一起工作)
但是,在上面的示例中,实际上有一个循环,因此可以使用GL_LINE_LOOP一次性完成 (这种方法非常适合VBO)
如果您实际上希望每条曲线有4个CV,那么您可以轻松地将其扩展为三次贝塞尔曲线。
注意:在现代硬件上,如果你有镶嵌着色器,那通常是最好的选择。如果你有硬件示例,你可以指定基本系数作为共享顶点缓冲区,并且控制点可以指定每个示例。
1.生成VBO以存储混合系数,并且将VBO设置为具有顶点除数0。
1.将所有曲线的控制点加载到单个BIG VBO中,设置4个每示例属性(即指定4个不同的着色器输入,每个CV一个,将每个步幅设置为sizeof(Cubic_Curve_CVS),并将除数设置为1)。
顶点着色器最终实现起来非常简单:
然后使用glDrawArraysInstanced一次性渲染整个场景。