C++ 无法使用glDrawArrays绘制

C++ 无法使用glDrawArrays绘制,c++,opengl,glew,C++,Opengl,Glew,为什么这个代码不起作用 // 1 square (made by 4 quads) to be rendered GLfloat vertices_position[] = { x, y, x+w, y, x+w, y+h, x, y+h, }; glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(2, GL_FLOAT, 0, vertices_position); glDrawArrays(GL_Q

为什么这个代码不起作用

 // 1 square (made by 4 quads) to be rendered
GLfloat vertices_position[] = {
    x, y,
    x+w, y,
    x+w, y+h,
    x, y+h,
};

glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2, GL_FLOAT, 0, vertices_position);

glDrawArrays(GL_QUADS, 0, 4);

glDisableClientState(GL_VERTEX_ARRAY);
我使用的是glew,没有编译错误,我得到的只是屏幕上没有画任何东西

如果我改用这个,效果很好:

glPushMatrix();

    glTranslatef(0, 0, 0);

    glScalef(scale,scale,1);
    //set color
    glColor4f(R, G, B, A);

    glBegin( GL_QUADS );

        glTexCoord2f(  texLeft,    texTop );
        glVertex2f( x, y );

        glTexCoord2f( texRight,    texTop );
        glVertex2f( x+w, y );

        glTexCoord2f( texRight, texBottom );
        glVertex2f( x+w, y+h );

        glTexCoord2f(  texLeft, texBottom );
        glVertex2f( x, y+h );

    glEnd();

glPopMatrix();
在这里工作很好:

#include <GL/glew.h>
#include <GL/glut.h>

bool vertexArray = false;
void keyboard( unsigned char key, int x, int y )
{
    if( key == 't' ) vertexArray = !vertexArray;
    glutPostRedisplay();
}

void display()
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    double winWidth = glutGet( GLUT_WINDOW_WIDTH );
    double winHeight = glutGet( GLUT_WINDOW_HEIGHT );
    double ar = winWidth / winHeight;
    glOrtho( -1 * ar, 1 * ar, -1, 1, -1, 1);

    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();

    float x = -0.5f;
    float y = -0.5f;
    float w = 1;
    float h = 1;
    float scale = 1;

    glPushMatrix();
    glTranslatef(0, 0, 0);
    glScalef(scale,scale,1);
    //set color
    glColor4f( 1, 0, 0, 1 );

    if( vertexArray )
    {
        GLfloat vertices_position[] = {
            x, y,
            x+w, y,
            x+w, y+h,
            x, y+h,
        };

        glEnableClientState(GL_VERTEX_ARRAY);
        glVertexPointer(2, GL_FLOAT, 0, vertices_position);
        glDrawArrays(GL_QUADS, 0, 4);
        glDisableClientState(GL_VERTEX_ARRAY);
    }
    else
    {
        glBegin( GL_QUADS );
        glVertex2f( x, y );
        glVertex2f( x+w, y );
        glVertex2f( x+w, y+h );
        glVertex2f( x, y+h );
        glEnd();
    }

    glPopMatrix();

    glutSwapBuffers();
}

int main( int argc, char **argv )
{
    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE );
    glutInitWindowSize( 640, 480 );
    glutCreateWindow( "GLUT" );
    glutDisplayFunc( display );
    glutKeyboardFunc( keyboard );
    glewInit();
    glutMainLoop();
    return 0;
}
#包括
#包括
布尔顶点阵列=假;
无效键盘(无符号字符键,整数x,整数y)
{
如果(键=='t')vertexArray=!vertexArray;
再发现();
}
无效显示()
{
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
glMatrixMode(GL_投影);
glLoadIdentity();
双winWidth=glutGet(GLUT\u窗口\u宽度);
双winHeight=glutGet(GLUT\u窗口\u高度);
双ar=winWidth/winHeight;
格洛托(-1*ar,1*ar,-1,1,1,1);
glMatrixMode(GLU模型视图);
glLoadIdentity();
浮动x=-0.5f;
浮动y=-0.5f;
浮点数w=1;
浮点数h=1;
浮标=1;
glPushMatrix();
glTranslatef(0,0,0);
glScalef(标度,标度,1);
//定色
gl4f(1,0,0,1);
if(顶点阵列)
{
GLfloat顶点\u位置[]={
x、 y,,
x+w,y,
x+w,y+h,
x、 y+h,
};
glEnableClientState(GL_顶点_数组);
glVertexPointer(2,GLU浮点,0,顶点位置);
gldrawArray(GL_四边形,0,4);
glDisableClientState(GL_顶点_数组);
}
其他的
{
glBegin(GL_QUADS);
glVertex2f(x,y);
glVertex2f(x+w,y);
glVertex2f(x+w,y+h);
glVertex2f(x,y+h);
格伦德();
}
glPopMatrix();
glutSwapBuffers();
}
int main(int argc,字符**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_深度| GLUT_双精度);
GLUTINITWindowsSize(640480);
GLUT(GLUT);
glutDisplayFunc(显示器);
键盘Func(键盘);
glewInit();
glutMainLoop();
返回0;
}
此处工作正常:

#include <GL/glew.h>
#include <GL/glut.h>

bool vertexArray = false;
void keyboard( unsigned char key, int x, int y )
{
    if( key == 't' ) vertexArray = !vertexArray;
    glutPostRedisplay();
}

void display()
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    double winWidth = glutGet( GLUT_WINDOW_WIDTH );
    double winHeight = glutGet( GLUT_WINDOW_HEIGHT );
    double ar = winWidth / winHeight;
    glOrtho( -1 * ar, 1 * ar, -1, 1, -1, 1);

    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();

    float x = -0.5f;
    float y = -0.5f;
    float w = 1;
    float h = 1;
    float scale = 1;

    glPushMatrix();
    glTranslatef(0, 0, 0);
    glScalef(scale,scale,1);
    //set color
    glColor4f( 1, 0, 0, 1 );

    if( vertexArray )
    {
        GLfloat vertices_position[] = {
            x, y,
            x+w, y,
            x+w, y+h,
            x, y+h,
        };

        glEnableClientState(GL_VERTEX_ARRAY);
        glVertexPointer(2, GL_FLOAT, 0, vertices_position);
        glDrawArrays(GL_QUADS, 0, 4);
        glDisableClientState(GL_VERTEX_ARRAY);
    }
    else
    {
        glBegin( GL_QUADS );
        glVertex2f( x, y );
        glVertex2f( x+w, y );
        glVertex2f( x+w, y+h );
        glVertex2f( x, y+h );
        glEnd();
    }

    glPopMatrix();

    glutSwapBuffers();
}

int main( int argc, char **argv )
{
    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE );
    glutInitWindowSize( 640, 480 );
    glutCreateWindow( "GLUT" );
    glutDisplayFunc( display );
    glutKeyboardFunc( keyboard );
    glewInit();
    glutMainLoop();
    return 0;
}
#包括
#包括
布尔顶点阵列=假;
无效键盘(无符号字符键,整数x,整数y)
{
如果(键=='t')vertexArray=!vertexArray;
再发现();
}
无效显示()
{
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
glMatrixMode(GL_投影);
glLoadIdentity();
双winWidth=glutGet(GLUT\u窗口\u宽度);
双winHeight=glutGet(GLUT\u窗口\u高度);
双ar=winWidth/winHeight;
格洛托(-1*ar,1*ar,-1,1,1,1);
glMatrixMode(GLU模型视图);
glLoadIdentity();
浮动x=-0.5f;
浮动y=-0.5f;
浮点数w=1;
浮点数h=1;
浮标=1;
glPushMatrix();
glTranslatef(0,0,0);
glScalef(标度,标度,1);
//定色
gl4f(1,0,0,1);
if(顶点阵列)
{
GLfloat顶点\u位置[]={
x、 y,,
x+w,y,
x+w,y+h,
x、 y+h,
};
glEnableClientState(GL_顶点_数组);
glVertexPointer(2,GLU浮点,0,顶点位置);
gldrawArray(GL_四边形,0,4);
glDisableClientState(GL_顶点_数组);
}
其他的
{
glBegin(GL_QUADS);
glVertex2f(x,y);
glVertex2f(x+w,y);
glVertex2f(x+w,y+h);
glVertex2f(x,y+h);
格伦德();
}
glPopMatrix();
glutSwapBuffers();
}
int main(int argc,字符**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_深度| GLUT_双精度);
GLUTINITWindowsSize(640480);
GLUT(GLUT);
glutDisplayFunc(显示器);
键盘Func(键盘);
glewInit();
glutMainLoop();
返回0;
}
我很笨。。。 我指定使用纹理,但从未将任何纹理绑定到顶点

这段代码工作得很好:

GLfloat vertices_position[] = {
    x, y,
    x+w, y,
    x+w, y+h,
    x, y+h,
};
GLfloat texture_coord[] = {
    texLeft, texTop,
    texRight, texTop,
    texRight, texBottom,
    texLeft, texBottom,
};

glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2, GL_FLOAT, 0, vertices_position);

glEnableClientState( GL_TEXTURE_COORD_ARRAY );
glTexCoordPointer(2, GL_FLOAT, 0, texture_coord);

glDrawArrays(GL_QUADS, 0, 4);

glDisableClientState( GL_TEXTURE_COORD_ARRAY );
glDisableClientState( GL_VERTEX_ARRAY );
我很愚蠢。。。 我指定使用纹理,但从未将任何纹理绑定到顶点

这段代码工作得很好:

GLfloat vertices_position[] = {
    x, y,
    x+w, y,
    x+w, y+h,
    x, y+h,
};
GLfloat texture_coord[] = {
    texLeft, texTop,
    texRight, texTop,
    texRight, texBottom,
    texLeft, texBottom,
};

glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2, GL_FLOAT, 0, vertices_position);

glEnableClientState( GL_TEXTURE_COORD_ARRAY );
glTexCoordPointer(2, GL_FLOAT, 0, texture_coord);

glDrawArrays(GL_QUADS, 0, 4);

glDisableClientState( GL_TEXTURE_COORD_ARRAY );
glDisableClientState( GL_VERTEX_ARRAY );

我用OpenGL做了一个2D设置,我不知道在哪里会被剔除。特别是如果我用即时模式替换代码,它会工作得很好。没错,现在你发布的代码看起来并不一致。我想说的是,OpenGL默认情况下会进行背面消隐,当它被消隐时可能会很痛苦,实际上并没有什么问题。我认为它正在被绘制,但它被绘制成全黑色,尝试在对GLDRAWARRAY的调用之前添加对glColor4f的调用。我在它后面绘制了一个平铺数组。所以任何颜色都会出现在屏幕上。但这也是我第一次打电话,但没什么不同。我用OpenGL做了一个2D设置,我不知道在哪里会被剔除。特别是如果我用即时模式替换代码,它会工作得很好。没错,现在你发布的代码看起来并不一致。我想说的是,OpenGL默认情况下会进行背面消隐,当它被消隐时可能会很痛苦,实际上并没有什么问题。我认为它正在被绘制,但它被绘制成全黑色,尝试在对GLDRAWARRAY的调用之前添加对glColor4f的调用。我在它后面绘制了一个平铺数组。所以任何颜色都会出现在屏幕上。但这也是我第一次打电话,但没什么不同。我厌倦了没有即时模式的纹理协调,也没有画出图像。。。所以我想我必须定义纹理坐标才能让数组工作!我厌倦了它没有即时模式的纹理协调,它没有画一个图像。。。所以我想我必须定义纹理坐标才能让数组工作!这发生在我们所有人身上,重要的是你发现了是什么导致了这个问题,啊,这让我发疯。很高兴它现在起作用了。VBO的下一个!;)这发生在我们所有人身上,重要的是你发现了是什么导致了这个问题,啊,这让我发疯。很高兴它现在起作用了。VBO的下一个!;)