2012-05-26 5 views
2

목표는 원근감있는 조명을 부드럽게 만드는 것입니다. 저는 원근법과 직교 모두 동일한 조명 설정을 사용하고 있습니다. 아래 이미지는 직교 조명이 멋지다는 것을 보여줍니다. 원근감 조명이 회전 할 때 이상하고 깜박입니다. 투시 뷰 조명을 괜찮게 보이게하는 것은 무엇입니까?OpenTK C# 원근법 조명이 이상하게 보입니다

프로세서 : AMD FX 6100 6 코어 3.31GHz

그래픽 : AMD 라데온 HD 6800

참고 : 나는 OpenGL을 예에서 참조. 나는 그들이 작동하는 방법을 찾기 위해 다양한 조명 설정으로 놀고 있었다. 이 게시물의 마지막에 붙여 넣은 코드는 이미지를 만든 코드입니다.

관점 : http://i.stack.imgur.com/pSXul.png

직교 : 여기

http://i.stack.imgur.com/Q7Yr2.png 내 paint 메소드 내에서 관련 코드입니다.


private void glControl1_Paint(object sender, PaintEventArgs e) 
{ 
    if (!glLoaded) 
     return; 

    GL.Enable(EnableCap.DepthTest); 
    //GL.Enable(EnableCap.Blend); 
    GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); 

    //SET PERSPECTIVE OR ORTHOGRAPHIC VIEW 
    if (chkPerspective.Checked) 
    { 
     double aspect = glControl1.Width/(double)glControl1.Height; 

     Matrix4 perspective = Matrix4.CreatePerspectiveFieldOfView(MathHelper.PiOver4, (float)aspect, 0.0001f, 5000.0f); 
     GL.MatrixMode(MatrixMode.Projection); 
     GL.LoadIdentity(); 
     GL.LoadMatrix(ref perspective); 

     Matrix4 lookat = Matrix4.LookAt(eyeOffset.X, eyeOffset.Y, eyeOffset.Z, 0, 0, 0, 0, 1, 0); 

     GL.MatrixMode(MatrixMode.Modelview); 
     GL.LoadMatrix(ref lookat); 


     //GL.Translate(-boxOffset); 
    } 
    else 
    { 
     setupViewPort(); //Orthographic settings 
     GL.MatrixMode(MatrixMode.Modelview); 
     GL.LoadIdentity(); 
    } 

    GL.Rotate(angleY, 1.0f, 0, 0); 
    GL.Rotate(angleX, 0, 1.0f, 0); 

    //LIGHTING 
    if (chkLighting.Checked) 
    { 
     float[] mat_specular = { 1.0f, 1.0f, 1.0f, 1.0f }; 
     float[] mat_shininess = { 50.0f }; 
     float[] light_position = { 1000.0f, 1000.0f, 1000.0f, 100.0f }; 
     float[] light_ambient = { 0.5f, 0.5f, 0.5f, 1.0f }; 

     GL.ClearColor(0.0f, 0.0f, 0.0f, 1.0f); 
     //GL.ShadeModel(ShadingModel.Smooth); 

     //GL.Material(MaterialFace.Front, MaterialParameter.Specular, mat_specular); 
     //GL.Material(MaterialFace.Front, MaterialParameter.Shininess, mat_shininess); 
     GL.Light(LightName.Light0, LightParameter.Position, light_position); 
     //GL.Light(LightName.Light0, LightParameter.Ambient, light_ambient); 
     //GL.Light(LightName.Light0, LightParameter.Diffuse, mat_specular); 

     GL.Enable(EnableCap.Lighting); 
     GL.Enable(EnableCap.Light0); 
     GL.Enable(EnableCap.ColorMaterial); 
     //GL.Enable(EnableCap.CullFace); 
    } 
    else 
    { 
     GL.Disable(EnableCap.Lighting); 
     GL.Disable(EnableCap.Light0); 
    } 

    foreach (Cube cube in cubes) 
    { 
     cube.drawCube(selectionCubeRadius); 
    } 

    glControl1.SwapBuffers(); 
} 
여기가 중요한 경우에는 내 직교 뷰포트 코드입니다. 기반

private void setupViewPort() 
{ 
    if (chkPerspective.Checked) 
     return; 

    int w = glControl1.Width; 
    int h = glControl1.Height; 
    GL.MatrixMode(MatrixMode.Projection); 
    GL.LoadIdentity(); 
    GL.Ortho(-w, w, -h, h, -5000, 5000); // Bottom-left corner pixel has coordinate (0, 0) 
    GL.Viewport(0, 0, w, h); // Use all of the glControl paintingarea 
} 
+0

전문가가 문제를 해결하는 데 필요한 모든 관련 정보가있는 것으로 보이는 좋은 질문입니다. 나는 그 전문가가 아니다. 나는 당신이 내가하는 것보다이 물건들을 코딩하는 것에 대해 더 많이 알고 있다고 확신한다. 나는 단지 하나만 볼 때 좋은 Q를 안다. –

+0

1.0f가 아닌 light_position.w로 100.0f를 원하십니까? –

+0

W를 1.0으로 변경하면 블록의 한쪽에서 다른 쪽까지의 광도가 덜 눈에 띄게 변경됩니다. 전망보기의 깜박임은 여전히 ​​있습니다. – user1334960

답변

0

지금은 해결 될 해결책을 찾았습니다. Perspective 뷰에서 큐브 크기를 200.0에서 5.0으로 줄였습니다. 그런 다음 카메라를 더 가깝게 이동시켜 동일한 크기로 보입니다. 어떤 이들은 또한 내 관점의 시야를 만들 때 나는 먼 Z면을 줄여야한다고 말했다.

내 모델의 크기를 줄 였지만 관례를 위해 먼 z면의 거리도 줄였습니다. 또한 현재 모델의 크기와 각도에 따라 사용할 z- 평면 거리를 결정하는 알고리즘을 만들 수도 있습니다.

사용자 'dflemstr'이 내 GL.Normal3f 호출에 대해 질문했습니다. 대답은 내가 없다는 것입니다. 그들이 무엇을하고 필요합니까?

+0

법선은 길이가 1 인 벡터로 표면에서 "벗어났다"는 것을 나타냅니다. 각 정점에는 법선이 있습니다. 예를 들어, 입방체의 위쪽 사각형의 경우 표면이 위를 향하기 때문에 (양의 Y) 각 꼭지점의 법선은 (0, 1, 0)이됩니다.법선을 지정하지 않으면 운전자가 추측해야하며 조명 계산이 잘못됩니다. – dflemstr

1

전적으로 이미지에, 그것은 깊이 테스트처럼 보인다는 사용할 수 없게됩니다 또는 일부 법선 반전 또는 비 표준화된다.

drawCube는 정확히 무엇을합니까?

+0

DrawCube()에는 GL.Begin (BeginMode.Quads)이 포함되어 있으며 큐브의 6면을 그린 다음 GL.End()를 그립니다. 그게 전부입니다. 법선이 올바른지 확인할 수있는 방법이 있습니까? – user1334960

+0

현재 귀하의'GL.Normal3f' 전화는 무엇입니까? 단위 길이의 벡터를 포함해야합니다. 코드를 게시하십시오! – dflemstr