openGL在不同的显示模式下绘制圆形三角形和正方形

时间:2017-01-27 04:27:42

标签: c++ xcode opengl opengl-es glut

我正在使用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 个答案:

答案 0 :(得分:2)

您的圈子代码不适用于GLUT_3_2_CORE_PROFILE因为glBeginglColor3fglVertex2fglEnd已在OpenGL 3中删除,因此OpenGL 3.2(或更高版本) )没有它们。

我不确定为什么没有GLUT_3_2_CORE_PROFILE你的三角形和方形代码不起作用,但考虑到在OpenGL 3中添加了VAO,当你没有指定GLUT_3_2_CORE_PROFILE时,你会得到一个3之前的版本。

选择一个版本并坚持下去。