Opengl 法线反转是因为GluPersitve?
只是在玩Opengl 法线反转是因为GluPersitve?,opengl,glut,normals,glulookat,Opengl,Glut,Normals,Glulookat,只是在玩opengl和glut。我试图让多维数据集充满visibe,所以我决定用glupperspective()实现它 这是代码 #include <iostream> #include <GL/glut.h> #include <GL/gl.h> using namespace std; float _angle = 0.1f; void render(){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BU
opengl
和glut
。我试图让多维数据集充满visibe,所以我决定用glupperspective()实现它代码>
这是代码
#include <iostream>
#include <GL/glut.h>
#include <GL/gl.h>
using namespace std;
float _angle = 0.1f;
void render(){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluPerspective(90.0, 1, 0.1, 100.0);
gluLookAt(1, 1, 1, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0);
glPushMatrix();
glRotatef(_angle, 0.0f,0.0f,1.0f);
glColor3f(1.0f,0.0f,0.0f);
glutSolidCube (1.0);
glPopMatrix();
_angle +=0.03f;
// check OpenGL error
GLenum err;
while ((err = glGetError()) != GL_NO_ERROR) {
cerr << "OpenGL error: " << err << endl;
}
glutSwapBuffers();
glutPostRedisplay();
}
void init(){
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(100,100);
glutInitWindowSize(640, 480);
glutCreateWindow("test");
glClearColor(0.2,0.2,0.2,0.0);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glutDisplayFunc(render);
glutMainLoop();
}
int main(int argc, char * argv[]) {
glutInit(&argc, argv);
init();
return 0;
}
#包括
#包括
#包括
使用名称空间std;
浮动角度=0.1f;
void render(){
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
glMatrixMode(GLU模型视图);
glLoadIdentity();
gluPerspective(90.0,1,0.1100.0);
gluLookAt(1,1,1,0.0,0.0,0.0,0.0,0.0,1.0);
glPushMatrix();
glRotatef(_角,0.0f,0.0f,1.0f);
GL3F(1.0f,0.0f,0.0f);
立体立方体(1.0);
glPopMatrix();
_角度+=0.03f;
//检查OpenGL错误
肩胛盂;
而((err=glGetError())!=GL\u无错误){
cerr我不一定说,当你弄乱投影矩阵时,法线是反转的,就像缠绕方向是反转的一样
OpenGL确定多边形缠绕,用于在投影后剔除前/后向多边形。当投影矩阵和modelview矩阵在Z应朝向哪个方向上不一致(换句话说,用手)时,您将遇到这些奇怪的问题
传统上,在OpenGL中,投影矩阵被设置为与modelview矩阵相乘时反转Z。固定函数管道一直以这种方式工作,这就是生成OpenGL右手坐标系的原因。如果翻转Z坐标,则会更改顶点在投影后缠绕的方向
话虽如此,我认为这实际上不是你的问题。你在这里使用逐顶点照明,并且你已经将modelview矩阵与投影矩阵相结合。当需要进行逐顶点照明计算时,它们是在错误的坐标空间中进行的。我建议你将modelview与projec分开激动
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
gluPerspective (90.0, 1, 0.1, 100.0);
glMatrixMode (GL_MODELVIEW);
glLoadIdentity ();
gluLookAt (1, 1, 1, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0);
现在,您已经正确地分离了变换矩阵和固定函数照明,以及其他一些东西,它们应该可以按预期工作
更新:
除了我上面描述的,还有一件事你忘了做。深度测试在OpenGL中默认是禁用的(因为不能保证你甚至有深度缓冲);你需要启用它
glEnable (GL_DEPTH_TEST);
调用glupspective(…)时,纵横比设置不正确
,它应该是640.0f/480.0f
而不是1
谢谢,但它没有正常工作。但是底部现在更亮了hehe@DanilGholtsman:我添加了一个与深度缓冲区相关的额外细节。如果启用GL\U深度测试
并像我最初解释的那样设置投影矩阵,照明应该可以正常工作直截了当地。