opengl程序求问… 一 为什么在按了方向键之后图中三角形再也不出现了 2 为什么打开深度测试后无三角形显示
opengl程序求问… 1 为什么在按了方向键之后图中三角形再也不出现了 2 为什么打开深度测试后无三角形显示
#include<gl/glut.h>
static GLfloat xRot = 0.0f;
static GLfloat yRot = 0.0f;
void RenderScene(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glRotatef(xRot, 1.0f, 0.0f, 0.0f);
glRotatef(yRot, 0.0f, 1.0f, 0.0f);
glTranslatef(0.0f, 0.0f, -200.0f);
glShadeModel(GL_SMOOTH);
glBegin(GL_TRIANGLES);
glColor3ub(255, 0, 0);
glVertex3f(100.0f, 0.0f, 0.0f);
glColor3ub(0, 255, 0);
glVertex3f(0.0f, 100.0f, 0.0f);
glColor3ub(0, 0, 255);
glVertex3f(0.0f, 0.0f, 100.0f);
glEnd();
glutSwapBuffers();
}
void SetupRC(void)
{
//glEnable(GL_DEPTH_TEST);
glFrontFace(GL_CCW);
glEnable(GL_CULL_FACE);
glClearColor(0.2f, 0.2f, 0.2f, 1.0f);
}
void ChangeSize(int w, int h)
{
if (h == 0)
h = 1;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0f, w/h, 1.0f, 300.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void SpecialKeys(int key, int x, int y)
{
if(key == GLUT_KEY_UP)
xRot-= 5.0f;
if(key == GLUT_KEY_DOWN)
xRot += 5.0f;
if(key == GLUT_KEY_LEFT)
yRot -= 5.0f;
if(key == GLUT_KEY_RIGHT)
yRot += 5.0f;
if(key > 356.0f)
xRot = 0.0f;
if(key < -1.0f)
xRot = 355.0f;
if(key > 356.0f)
yRot = 0.0f;
if(key < -1.0f)
yRot = 355.0f;
glutPostRedisplay();
}
int main()
{
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowSize(600,600);
glutCreateWindow("Sample");
glutReshapeFunc(ChangeSize);
glutSpecialFunc(SpecialKeys);
glutDisplayFunc(RenderScene);
SetupRC();
glutMainLoop();
return 0;
}
------解决方案--------------------
RenderScene 函数里面,
glMatrixMode 以后,调用 glLoadIdentity,不然经过几次渲染以后,你的 modelview 已经跑得没边了
加入深度测试以后,1.你没分配 depth buffer, 2.你没清除 depth buffer, 当然也就悲剧了
------解决方案--------------------
按照调用的顺序来边的呗。我记得 OpenGL 里面这几个函数都是算一个矩阵,然后乘以原来的矩阵
#include<gl/glut.h>
static GLfloat xRot = 0.0f;
static GLfloat yRot = 0.0f;
void RenderScene(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glRotatef(xRot, 1.0f, 0.0f, 0.0f);
glRotatef(yRot, 0.0f, 1.0f, 0.0f);
glTranslatef(0.0f, 0.0f, -200.0f);
glShadeModel(GL_SMOOTH);
glBegin(GL_TRIANGLES);
glColor3ub(255, 0, 0);
glVertex3f(100.0f, 0.0f, 0.0f);
glColor3ub(0, 255, 0);
glVertex3f(0.0f, 100.0f, 0.0f);
glColor3ub(0, 0, 255);
glVertex3f(0.0f, 0.0f, 100.0f);
glEnd();
glutSwapBuffers();
}
void SetupRC(void)
{
//glEnable(GL_DEPTH_TEST);
glFrontFace(GL_CCW);
glEnable(GL_CULL_FACE);
glClearColor(0.2f, 0.2f, 0.2f, 1.0f);
}
void ChangeSize(int w, int h)
{
if (h == 0)
h = 1;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0f, w/h, 1.0f, 300.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void SpecialKeys(int key, int x, int y)
{
if(key == GLUT_KEY_UP)
xRot-= 5.0f;
if(key == GLUT_KEY_DOWN)
xRot += 5.0f;
if(key == GLUT_KEY_LEFT)
yRot -= 5.0f;
if(key == GLUT_KEY_RIGHT)
yRot += 5.0f;
if(key > 356.0f)
xRot = 0.0f;
if(key < -1.0f)
xRot = 355.0f;
if(key > 356.0f)
yRot = 0.0f;
if(key < -1.0f)
yRot = 355.0f;
glutPostRedisplay();
}
int main()
{
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowSize(600,600);
glutCreateWindow("Sample");
glutReshapeFunc(ChangeSize);
glutSpecialFunc(SpecialKeys);
glutDisplayFunc(RenderScene);
SetupRC();
glutMainLoop();
return 0;
}
opengl
------解决方案--------------------
RenderScene 函数里面,
glMatrixMode 以后,调用 glLoadIdentity,不然经过几次渲染以后,你的 modelview 已经跑得没边了
加入深度测试以后,1.你没分配 depth buffer, 2.你没清除 depth buffer, 当然也就悲剧了
------解决方案--------------------
按照调用的顺序来边的呗。我记得 OpenGL 里面这几个函数都是算一个矩阵,然后乘以原来的矩阵