gpt4 book ai didi

c++ - 调整光源大小

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:48:30 25 4
gpt4 key购买 nike

我目前正在尝试从屏幕左下角开始放置一盏灯,并照亮屏幕中央,但我的光源看起来不是圆形的(光线似乎不是来自一个点)。 enter image description here

移动光源后,它照亮了整个物体,但所需的效果是光源仅(基于一个点)向右发光。

enter image description here

void init()
{
camPos[0]= -(size/2)*.1;
camPos[1]= size*.1;
camPos[2]= -(size/2)*.1;
zoom = size/10;
glClearColor(0,0,0,0);
glColor3f(1, 1, 1);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();

//Enable backface culling
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
glFrontFace(GL_CW);

//Enable Lighting
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);

light_pos[0] = 1;
light_pos[1] = 10;
light_pos[2] = 1;
light_pos[3] = 1;

gluPerspective(45, 1, 1, 100);

};

void display()
{

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
//Camera
radians = float(pi*(angle-90.0f)/180.0f);
//initialize look
look[0] = (size/2)*.1;
look[1] = 1;
look[2] = (size/2)*.1;

camPos[0] = look[0] + sin(radians)*zoom;
camPos[1] = size/10;
camPos[2] = look[2] + cos(radians)*zoom;

gluLookAt(camPos[0], camPos[1], camPos[2], look[0],look[1],look[2], 0,1,0);
//lighting
//glColor3f(1,1,1);


float m_amb[] = {0.2, 0.2, 0.2, 1.0};
float m_dif[] = {1, 1, 1, 1.0};
float m_spec[] = {1, 1, 1, 1.0};
float shiny = 27;

glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, m_amb);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, m_dif);
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, m_spec);
glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, shiny);


glLightfv(GL_LIGHT0, GL_POSITION, light_pos);
glShadeModel(GL_SMOOTH);
drawTerrain(terrainA, size);
glutSwapBuffers();

};

int main (int argc, char** argv)
{
srand(time(NULL));
//When program starts enter value

printf("Enter an int between 50 and 300: ");
scanf("%i",&size);

if ( size < 50 || size > 300){
printf("Invalid size! Please re-run \n");
return 0;
}
populateArray();
//Starts glut
glutInit(&argc, argv);
//Init display
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(800, 800);
glutInitWindowPosition(600, 100);
glutCreateWindow("Terrain");glEnable(GL_DEPTH_TEST);
//Registering Callbacks
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);
glutSpecialFunc(special);

glEnable(GL_DEPTH_TEST);
init();

glutMainLoop();


return 0;
};

最佳答案

一般做法是将光衰减因子定义为光方程的系数。

enter image description here

glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 1.5);
glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.5);
glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 0.2);

其中 kc 是常数衰减因子,kl - 线性衰减因子,kq - 二次衰减因子,d - 到光源的距离。您可以修改此系数以达到您想要的效果。

这个例子无法正常工作,所以我建议使用着色器构建您自己的光分布函数,它可以很容易地达到预期的效果并且更有效(并且总是有效)。

关于c++ - 调整光源大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33641046/

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