2012-01-18 4 views
1

OpenGL ES 2.0의 새로운 제안입니다. iOS 플랫폼에서 OpenGL ES 2.0을 사용하여 스페 큘러 매핑을 구현하려고합니다. 내 지식에 따라, specular 매핑에서 우리는 specular map texture로부터 빛의 specular 성분에 대한 값을 추출한다. 버텍스 쉐이더에서 내가하고있는 일은 다음과 같습니다 :OpenGL ES 2.0의 스페셜 매핑

vec3 N = NormalMatrix * Normal; 
vec3 L = normalize(LightPosition); 
vec3 E = normalize(EyePosition); 
vec3 H = normalize(L + E); 
vec4 Specular=(texture2D(sampler_spec, TextureCoordIn)).rgba; 

float df = max(0.0, dot(N, L)); 
float sf = max(0.0, dot(N, H)); 
sf = pow(sf, Specular.a); 

vec3 color = AmbientMaterial + df * DiffuseMaterial + sf * Specular.rgb * SpecularMaterial; 

DestinationColor = vec4(color, 1); ` 

그러나 내 게임에서 반사 효과를 볼 수 없습니다. 나는 내가 어디로 잘못 가고 있는지 모른다. 소중한 제안을하십시오.

답변

1

잘 계산은 상당히 합리적입니다. 문제는 정점 별 조명을하고 있다는 것입니다. 이는 조명이 정점 쉐이더에서 수행 할 때마다 정점별로 계산되고 삼각형 사이에 보간됨을 의미합니다. 따라서 조명 품질은 메쉬의 테셀레이션 품질에 따라 크게 좌우됩니다.

큰 삼각형이있는 경우, 반사 하이라이트와 같은 고주파 효과는 실제로 나타나지 않습니다. 특히 텍스처를 사용할 때. 텍스처를 사용하는 이유는 서브 삼각형 레벨에서 서페이스 디테일을 제공하는 것이지만, 현재는 버텍스마다 텍스처를 읽으므로 반사가 정점 속성 일 수 있습니다.

그래서 첫 번째 단계는 조명 계산을 프래그먼트 셰이더로 옮기는 것입니다. 버텍스 쉐이더에서는 N, LE (정상화하는 것을 잊지 말것)을 계산하여 변이 값으로 계산합니다. 프래그먼트 쉐이더에서는 나머지를 계산합니다. 보간 된 N, LE (다시 정규화하는 것을 잊지 마십시오)을 기반으로합니다.

가변 조명 및 조각 별 조명에 대한 모든 개념이 현재 조금씩 높아지고있는 경우 셰이더의 기초에 대해 좀 더 깊이 알아보고 간단한 조각 별 조명 쉐이더에 대한 자습서를 찾아보아야합니다. 이것들은 specular mapping이나 bump mapping과 같은 것들을 쉽게 적용 할 수 있습니다 ...

+0

Hi Christian Rau 님, 회신에 따라 프래그먼트 쉐이더에서 조명 계산을 변경했습니다. 범프 맵핑과 관련하여 한 가지 더 물어보고 싶습니다. 또한 범프 맵을 구현하려고합니다. 범프 맵핑에 대해 조금 공부했는데 그 중 대부분은 명확합니다. 나는 형상을 렌더링하기 위해 OBJ를 사용하고 있습니다. 범프 매핑에 필요한 꼭지점 당 정점을 찾는 데 어려움이 있습니다. U는 훌륭한 전문 지식을 갖고있는 것처럼 보이므로 범프 맵핑에 필요한 버텍스 탄젠트 (vertex tangents)를 찾는 데 귀중한 제안을하십시오 ..... – hurricane

+0

@hurricane 물론 또 다른 질문에 가치가있을 것입니다. 그러나 먼저 여기 [http] //www.terathon.com/code/tangent.html) 및 [here] (http://fabiensanglard.net/bumpMapping/index.php)를 참조하십시오. 아이디어는 각 삼각형에 대한 탄젠트와 비트 탄젠트 (삼각형마다 일정하고 삼각형의 꼭지점의 텍스처 좌표에 따라 달라짐)를 계산 한 다음 각 꼭지점에 인접한 모든 삼각형의 탄젠트를 평균하는 것입니다. –

+0

@hurricane 그래서 specular 매핑이 올바르게 작동합니까? 그렇다면 투표 및 수락은 항상 감사합니다. 그렇지 않다면 언제든지 질문을 업데이트하거나 의견을 쓸 수 있습니다. –