2015-11-10 63 views
2

目前我正在试图从我的屏幕的底部左侧开始和照明对我的屏幕的中心,但我的光源不会出现圆形(光似乎并不轻定位从单一现身点)。 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; 
}; 
+2

如果你发布你的代码,它可以帮助人们很多。 – EkcenierK

+0

@KLibby对不起, –

+0

你的灯光位置看起来不对。点光源的最后值必须为1,方向性为0。尝试类似(10,1,10,1)或(10,1,10,1)。 –

回答

0

一般PRACTIC是定义光衰减因素,如光方程的coeficients。

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 - 至光源的距离。你可以修改这个系数来达到你想要的效果。

这个例子不能正常工作,所以我建议使用着色器来建立你自己的光destribution功能,这将是简单才达到预期的效果,更有效的(而且会一直工作)。

+0

感谢您的帮助,这就是我一直在寻找的。 –