openGL在不同显示模式下绘制圆形三角形和正方形
Posted
技术标签:
【中文标题】openGL在不同显示模式下绘制圆形三角形和正方形【英文标题】:openGL draw circle triangle and square in different display mode 【发布时间】:2017-01-27 04:27:42 【问题描述】:我正在使用 Xcode 编写 openGL。我正在做的是画一个圆、一个三角形和一个正方形。
但是我发现我的圈子只能显示在
glutInitDisplayMode(GLUT_RGBA | GLUT_SINGLE);
三角形和正方形只能在glutInitDisplayMode(GLUT_3_2_CORE_PROFILE|GLUT_RGBA | GLUT_SINGLE);
上显示
如何让它们一起显示?
这是我整个代码的一部分:
#include "Angel.h" //includes gl.h, glut.h and other stuff...
void m_glewInitAndVersion(void); //pre-implementation declaration (could do in header file)
void close(void);
//Mesh 0
GLuint buffer[3];
GLuint VAO[3];
GLuint color_loc;
GLuint program;
const int NumVertices = 4;
// Vertices of a unit cube centered at origin, sides aligned with axes
vec2 points[4] =
vec2( 0.25, 0.25),
vec2( 0.75, 0.25),
vec2( 0.75, 0.75),
vec2( 0.25, 0.75)
;
vec2 points2[3]=
vec2(-1,-1),
vec2(0,-1),
vec2(0,-0.7);
// RGBA colors
vec4 blue_opaque = vec4( 0.0, 0.0, 1.0, 1.0 );
vec4 red_opaque = vec4(1.0, 0.0, 0.0, 1.0);
//----------------------------------------------------------------------------
// OpenGL initialization
void
init()
glClearColor( 1.0, 1.0, 1.0, 1.0 );
// glColor3f(1.0, 0.0, 0.0);
// glMatrixMode(GL_PROJECTION);
// glLoadIdentity();
// gluOrtho2D(-3.5, 3.5, -3.5, 3.5);
// Create and initialize a buffer object
glGenBuffers( 2, buffer );
glBindBuffer( GL_ARRAY_BUFFER, buffer[0] );
glBufferData( GL_ARRAY_BUFFER, sizeof(points), points, GL_STATIC_DRAW );
// Load shaders and use the resulting shader program
program = InitShader( "vshader00_v150.glsl", "fshader00_v150.glsl" );
glUseProgram( program );
// set up vertex arrays
GLuint vPosition = glGetAttribLocation( program, "vPosition" );
//Set up VAO
glGenVertexArrays(2,VAO);
glBindVertexArray(VAO[0]);
glBindBuffer(GL_ARRAY_BUFFER,buffer[0]);
glEnableVertexAttribArray( vPosition );
glVertexAttribPointer( vPosition, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0) );
color_loc = glGetUniformLocation(program, "color");
//triangle
// glBindVertexArray(VAO[1]);
// glBindBuffer(GL_ARRAY_BUFFER, buffer[1]);
// glBufferData(GL_ARRAY_BUFFER, sizeof(points2), points2, GL_STATIC_DRAW);
// glUseProgram(program);
// glEnableVertexAttribArray(vPosition);
// glVertexAttribPointer(vPosition, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0) );
//----------------------------------------------------------------------------
void
display( void )
glClear( GL_COLOR_BUFFER_BIT );
// const float PI=3.14159;
// glBegin(GL_TRIANGLE_FAN);
// All triangles fan out starting with this point
// glVertex2f (0.0,0.0);
// for (int i = 0; i <=361; i++)
//
// glColor3f(float(rand())/float(RAND_MAX),
// float(rand())/float(RAND_MAX),
// float(rand())/float(RAND_MAX));
// glVertex2f(2.0*cos(i*PI/180), 2.0*sin(i*PI/180));
//
// glEnd();
glBindVertexArray(VAO[0]);
glDrawArrays( GL_TRIANGLE_FAN, 0, NumVertices );
glUseProgram(program);
glUniform4fv(color_loc, 1, blue_opaque);
// glBindVertexArray(VAO[1]);
// glDrawArrays( GL_TRIANGLE_FAN, 0, 3);
// glUseProgram(program);
// glUniform4fv(color_loc, 1, red_opaque);
glFlush();
int main( int argc, char **argv )
glutInit( &argc, argv );
#ifdef __APPLE__
glutInitDisplayMode(GLUT_3_2_CORE_PROFILE|GLUT_RGBA | GLUT_SINGLE);
#else
glutInitDisplayMode( GLUT_RGBA | GLUT_SINGLE);
#endif
glutInitWindowSize( 500, 500 );
glutCreateWindow( "CS 432 Hello World" );
m_glewInitAndVersion();
init();
glutDisplayFunc( display );
glutKeyboardFunc( keyboard );
glutWMCloseFunc(close);
glutMainLoop();
return 0;
【问题讨论】:
“这是我整个代码的一部分” - 绘制三角形、圆形和正方形的代码在哪里?这是最重要的部分。 它们都在我的初始化和显示函数中 圆形和三角形显然不起作用,因为它们的代码被注释掉了,一方面。 是的,我将它们注释掉以使代码运行。因为圈子不能和其他两个一起跑。 【参考方案1】:您的圈子代码不适用于 GLUT_3_2_CORE_PROFILE,因为 glBegin
、glColor3f
、glVertex2f
和 glEnd
在 OpenGL 3 中已被删除,因此 OpenGL 3.2(或更高版本)没有它们。
我不确定为什么您的三角形和正方形代码在没有 GLUT_3_2_CORE_PROFILE 的情况下无法工作,但请考虑在 OpenGL 3 中添加了 VAO,并且当您不指定 GLUT_3_2_CORE_PROFILE 时,您会获得 3 之前的版本。
选择一个版本并坚持下去。
【讨论】:
哇,非常感谢!我对 OpenGL 真的很陌生。 无论如何我可以在 OpenGL 3 中画圆吗?我发现大多数教程都使用我使用的方式。 @AllenYang 是的,您可以创建一个缓冲区,并将坐标放入缓冲区中,然后从缓冲区中绘制...就像您已经对正方形和三角形所做的那样。 您好,您能详细解释一下吗? @AllenYang No. 搜索 OpenGL 教程。以上是关于openGL在不同显示模式下绘制圆形三角形和正方形的主要内容,如果未能解决你的问题,请参考以下文章