Assimp를 사용하여 3D 모델을 가져오고 노멀 맵에 대한 접선과 비트를 제공합니다. 그러나 꼭지점 셰이더에서 접선과 비트 맵 벡터를 곱하는 데 사용되는 행렬이 무엇인지 알 수 없습니다. WorldViewProjection 매트릭스 또는 다른 특수 목적의 "일반 매트릭스"입니까?OpenGL 버텍스 쉐이더 용 NormalMatrix?
UPDATE : 내 버텍스 쉐이더
const std::string gVertexShader = "#version 330 \n \
\n \
layout(std140) uniform; \n \
\n \
uniform UnifTransform \n \
{ \n \
mat4 mWVPMatrix; \n \
mat4 mWorldMatrix; \n \
float mTextureTilingFactor; \n \
} Transform; \n \
\n \
layout(location = 0) in vec3 vert_position; \n \
layout(location = 1) in vec3 vert_normal; \n \
layout(location = 2) in vec2 vert_texcoord; \n \
layout(location = 3) in vec3 vert_tangent; \n \
layout(location = 4) in vec3 vert_bitangent; \n \
\n \
out vec3 frag_position; \n \
out vec3 frag_normal; \n \
out vec2 frag_texcoord; \n \
out vec3 frag_tangent; \n \
out vec3 frag_bitangent; \n \
\n \
void main() \n \
{ \n \
gl_Position = Transform.mWVPMatrix * vec4(vert_position, 1.0); \n \
\n \
vec4 position = Transform.mWorldMatrix * vec4(vert_position, 1.0); \n \
vec4 normal = Transform.mWorldMatrix * vec4(vert_normal, 0.0); \n \
vec4 tangent = Transform.mWorldMatrix * vec4(vert_tangent, 0.0); // correct matrix? \n \
vec4 bitangent = Transform.mWorldMatrix * vec4(vert_bitangent, 0.0); \n \
\n \
frag_position = position.xyz; \n \
frag_normal = normal.xyz; \n \
frag_tangent = tangent.xyz; \n \
frag_bitangent = bitangent.xyz; \n \
frag_texcoord = Transform.mTextureTilingFactor * vert_texcoord; \n \
그러나이 매트릭스가 프래그먼트 셰이더에서 사용되지 않았습니까? 버텍스 쉐이더에있는 것을 참조하고 있습니다. 업데이트 된 질문입니다. – KaiserJohaan
@KaiserJohaan : 반드시 그런 것은 아닙니다. 조각 쉐이더에서이를 사용하여 샘플 된 접선 공간 법선을 오브젝트 공간으로 변환 할 수 있습니다. 이는 지연 쉐이딩에서 매우 일반적입니다. 또한 조명 방향 벡터를 버텍스 쉐이더의 접선 공간으로 변환하는 데 사용할 수도 있습니다. 이것은 프래그먼트 쉐이더의 복잡성을 줄여줌으로써 포워드 쉐이딩 엔진에서 유용합니다. 그러나 모든 경우에 꼭지점 법선, 접선 또는 비트 대를 변환 할 필요가 없습니다. TBN 행렬을 변경하여 공간을 볼 수있는 접선 공간을 만들 수도 있지만 (객체 공간은 대개 유용하지 않습니다) . –
@KaiserJohaan : *** 조각 쉐이더 ***에서 탄젠트, 비트 겐트 및 법선 벡터를 사용하는 방법을 정확하게 설명 할 수 있습니까? 업데이트 된 질문에서 샘플링 된 접선 공간 법선을 다른 벡터 공간 (이 경우에는 월드 공간)으로 변환한다는 인상을 받고 있습니다. –