gpt4 book ai didi

c - OpenGL - 使用锥形聚光灯创建平面

转载 作者:太空宇宙 更新时间:2023-11-04 01:13:04 26 4
gpt4 key购买 nike

我在创建一个有锥形聚光灯指向它的矩形表面时遇到了问题。到目前为止,我已经尝试创建一个 2D 立方体表面 (glutSolidCube()) 并使用 GL_SPOT_XXX 来创建聚光灯。但我不知道为什么,光一直在整个表面散射,而不是聚集到一个点上。

到目前为止,这是我的代码,您可以只关注 init_light()display() 函数。其他功能供您引用,如果您需要:)

void rotateCamera()
{
/* Rotate camera 2 degrees about selected axis */
theta[axis] += dtheta;
if (theta[axis] > 360.0 ) theta[axis] -= 360.0;
glutPostRedisplay();
}

void computeCameraPosition() {
GLdouble M[16];

glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glTranslatef(centroid[0], centroid[1], centroid[2]);
glRotatef(theta[0], 1.0, 0.0, 0.0);
glRotatef(theta[1], 0.0, 1.0, 0.0);
glRotatef(theta[2], 0.0, 0.0, 1.0);
glTranslatef(-centroid[0], -centroid[1], -centroid[2]);
glGetDoublev(GL_MODELVIEW_MATRIX, M);

GLdouble newvec[16];

glMultMatrixd(init_vec);
glGetDoublev(GL_MODELVIEW_MATRIX, newvec);
glPopMatrix();

/* the 1st and 2nd columns are the eye position and new y-axis direction */
memcpy(eye, newvec, sizeof(GLdouble)*4);
memcpy(yaxis, newvec+4, sizeof(GLdouble)*4);
}

void init_light()
{
GLfloat spot_direction[] = { 1.0, 1.0, 0.0 };
glLightfv( GL_LIGHT0, GL_SPOT_DIRECTION, spot_direction );
glLightf( GL_LIGHT0, GL_SPOT_EXPONENT, 2.0 );
glLightf( GL_LIGHT0, GL_SPOT_CUTOFF, 45.0 );

glShadeModel(GL_SMOOTH);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_COLOR_MATERIAL);
}


void display() {
computeCameraPosition();
glClearColor(0.9, 0.9, 0.9, 1.0);
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(eye[0], eye[1], eye[2],
centroid[0], centroid[1], centroid[2],
yaxis[0], yaxis[1], yaxis[2]);
glutSolidCube(2.0);
glFlush();
glutSwapBuffers();
}

int main(int argc, char **argv) {
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(800, 800);
glutInitWindowPosition (200, 100);
glutCreateWindow("Scene Editor");
init_light();
glutDisplayFunc(display);
glutMainLoop();
}

最佳答案

标准固定函数 OpenGL 照明仅在顶点位置进行评估,并在基元上插值确定颜色。所以要得到聚光灯效果,照度必须用高分辨率来评估。您可以通过镶嵌您的平面或使用片段着色器来实现此目的按片段照明


编辑以回答评论

镶嵌

Tesselation 意味着,将您的平面 segmentation 为大量“补丁”。像这样:

+---------------------+
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
+---------------------+

+-+-+-+-+-+-+-+-+-+-+-+
| | | | | | | | | | | |
+-+-+-+-+-+-+-+-+-+-+-+
| | | | | | | | | | | |
+-+-+-+-+-+-+-+-+-+-+-+
| | | | | | | | | | | |
+-+-+-+-+-+-+-+-+-+-+-+
| | | | | | | | | | | |
+-+-+-+-+-+-+-+-+-+-+-+
| | | | | | | | | | | |
+-+-+-+-+-+-+-+-+-+-+-+
| | | | | | | | | | | |
+-+-+-+-+-+-+-+-+-+-+-+

每个片段光照

逐片段光照意味着,在每个光栅化片段(片段通常指的是像素)处计算光照方程。为此,使用了片段着色器,即加载到图形处理器 (GPU) 中的小程序,它针对光栅化图元(三角形、线、点)的每个片段/像素执行。

Lighthouse3D 有一个教程:http://www.lighthouse3d.com/tutorials/glsl-tutorial/spot-light-per-pixel/我建议您在那里阅读完整的 GLSL 教程,了解发生了什么。

关于c - OpenGL - 使用锥形聚光灯创建平面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7785774/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com