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的下一个!;)