목표는 원근감있는 조명을 부드럽게 만드는 것입니다. 저는 원근법과 직교 모두 동일한 조명 설정을 사용하고 있습니다. 아래 이미지는 직교 조명이 멋지다는 것을 보여줍니다. 원근감 조명이 회전 할 때 이상하고 깜박입니다. 투시 뷰 조명을 괜찮게 보이게하는 것은 무엇입니까?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
}
전문가가 문제를 해결하는 데 필요한 모든 관련 정보가있는 것으로 보이는 좋은 질문입니다. 나는 그 전문가가 아니다. 나는 당신이 내가하는 것보다이 물건들을 코딩하는 것에 대해 더 많이 알고 있다고 확신한다. 나는 단지 하나만 볼 때 좋은 Q를 안다. –
1.0f가 아닌 light_position.w로 100.0f를 원하십니까? –
W를 1.0으로 변경하면 블록의 한쪽에서 다른 쪽까지의 광도가 덜 눈에 띄게 변경됩니다. 전망보기의 깜박임은 여전히 있습니다. – user1334960