2011-11-03 47 views
5

Tôi có phải đặt chiếu sáng trong một bức ảnh OpenGL nhưng tôi không biết làm thế nào để đặt một đúng ánh sáng điểm chiếu sáng như trong hình sau:OpenGL chiếu sáng và chiếu sáng

Right

Đối với bây giờ tôi đã cố gắng chế độ khác nhau của ánh sáng, nhưng kết quả là như sau :(

Wrong

tôi đính kèm cho bạn mã mà tôi sử dụng cho kết quả của tôi. Điều gì là sai?

float specref[] = { 1.0f, 1.0f, 1.0f, 1.0f }; 
    // Light values and coordinates 
    float ambientLight[] = { 0.3f, 0.3f, 0.3f, 1.0f }; 
    float diffuseLight[] = { 0.7f, 0.7f, 0.7f, 1.0f }; 
    float specular[] = { 1.0f, 1.0f, 1.0f, 1.0f}; 
    float lightPos[] = { 0.0f, -150.0f, -150.0f, 1.0f }; 

    glEnable (GL_LIGHTING) ; 

    glLightfv(GL_LIGHT0,GL_AMBIENT, ambientLight); 
    glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuseLight); 
    glLightfv(GL_LIGHT0,GL_SPECULAR,specular); 
    glLightfv(GL_LIGHT0,GL_POSITION,lightPos); 
    glEnable(GL_LIGHT0); 
    glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); 
    glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR,specref); 
    glMateriali(GL_FRONT_AND_BACK,GL_SHININESS,128); 
    glEnable (GL_COLOR_MATERIAL) ; 

    glClearColor (1.0, 1.0, 1.0, 1.0); 
    glColor3f(0.0,0.0,0.0); 

Sửa 04/11/2011 0,39 CET

Tôi cũng đính kèm display() chức năng của tôi gọi bằng glutDisplayFunc (hiển thị);

void display(void) 

    { 

    [...] 

    //Draw polygons in 3d 

    glColor3f(0.0,1.0,1.0); 

    glBegin(GL_QUADS); 

    for(i=0;i<NVERT-1;i++) { 

     for (j=0;j<NVERT-1;j++) { 

       glVertex3f((GLfloat)((sb[i*NVERT+j]).x()), 

             (GLfloat)((sb[i*NVERT+j]).y()), 

             (GLfloat)((sb[i*NVERT+j]).z())); 


       glVertex3f((GLfloat)((sb[i*NVERT+j+1]).x()), 

             (GLfloat)((sb[i*NVERT+j+1]).y()), 

             (GLfloat)((sb[i*NVERT+j+1]).z())); 


       glVertex3f((GLfloat)((sb[(i+1)*NVERT+j+1]).x()), 

             (GLfloat)((sb[(i+1)*NVERT+j+1]).y()), 

             (GLfloat)((sb[(i+1)*NVERT+j+1]).z())); 


       glVertex3f((GLfloat)((sb[(i+1)*NVERT+j]).x()), 

             (GLfloat)((sb[(i+1)*NVERT+j]).y()), 

             (GLfloat)((sb[(i+1)*NVERT+j]).z())); 


     } 



    } 

    glEnd(); 
    glFlush(); 

    } 

Thực hành với màn hình Tôi viết các vùng nhỏ tạo thành hình 2 ° mà tôi biểu diễn (tôi bỏ qua thuật toán để tính các điểm của từng khu vực vì nó hoạt động).

Mục tiêu của tôi là phải có một kết quả tương tự như hình 1 cho sét và cung cấp con số này nhưng tôi chỉ thu được kết quả trong hình 2.

Tôi không biết làm thế nào để đặt một cách chính xác ánh sáng và làm thế nào để thiết lập con số của tôi để có được điều này (như gương).

+2

Đăng một hoàn chỉnh, ví dụ tối thiểu đó chứng tỏ vấn đề. – genpfault

+4

Có thể là một vài điều. Tôi đoán bạn không có bất kỳ bình thường, nhưng đoán hoang dã. Chúng ta cần một ví dụ tối thiểu như @genpfault chỉ ra. – larsmoa

+0

Là hình ảnh đầu tiên bạn muốn đạt được và hình ảnh thứ hai bạn có vào lúc này? – NickLH

Trả lời

1

Bạn đang thiếu tiêu chuẩn. Bạn cần phải cung cấp một bình thường trên mỗi đỉnh (glNormal) hoặc bạn có thể bật GL_AUTO_NORMALS nếu bạn sử dụng glMap2 (mà bạn không sử dụng). Có một bài viết về cách compute normals for a triangle or polygons trên opengl.org mà bạn có thể sẽ thấy hữu ích.

Begin Function CalculateSurfaceNormal (Input Polygon) Returns Vector 

    Set Vertex Normal to (0, 0, 0) 

    Begin Cycle for Index in [0, Polygon.vertexNumber) 

     Set Vertex Current to Polygon.verts[Index] 
     Set Vertex Next to Polygon.verts[(Index plus 1) mod Polygon.vertexNumber] 

     Set Normal.x to Sum of Normal.x and (multiply (Current.y minus Next.y) by (Current.z plus Next.z)) 
     Set Normal.y to Sum of Normal.y and (multiply (Current.z minus Next.z) by (Current.x plus Next.x)) 
     Set Normal.z to Sum of Normal.z and (multiply (Current.x minus Next.x) by (Current.y plus Next.y)) 

    End Cycle 

    Returning Normalize(Normal) 

End Function 

Từ hình ảnh bạn đã đăng kết quả có vẻ như bạn đang tính toán và vẽ các chỉ tiêu (mũi tên màu đỏ), không áp dụng chúng.

0

Không thể thực sự tìm ra điều đang xảy ra với mã của bạn. Tôi hy vọng rằng bạn đã có khoảng cách từ -1 đến +1. Tôi muốn đề nghị bạn làm việc với ánh sáng với các nguyên thủy đơn giản. công việc trên với thế hệ bề mặt của bạn. Vị trí của nguồn sáng và các tiêu chuẩn tính toán là những điểm quan trọng nhất.

http://www.falloutsoftware.com/tutorials/gl/gl8.htm

http://glprogramming.com/red/chapter05.html

+1

Tôi không biết lý do tại sao tọa độ phải ở [-1,1], trừ khi bạn có nghĩa là các tiêu chuẩn không thực sự ở đó. –

+0

các thông số ánh sáng có vẻ ở giữa -1 đến +1 và nếu ánh xạ giá trị cao hơn, anh ấy sẽ không thể thấy hiệu ứng. đó là những gì tôi đã xác nhận – sarat

+0

Các thông số ánh sáng nào có trong [-1,1]? Tôi hy vọng bạn không có nghĩa là màu sắc, mà không có bất cứ điều gì để làm với bất kỳ tọa độ (và là trong [0,1], anyway). Và vị trí của ánh sáng (chỉ có "tham số chiếu sáng" liên quan đến tọa độ) là (0, -150, -150). –

Các vấn đề liên quan