GLSL 4.0 메쉬 회전이 정상적으로 엉망입니까? 도와주세요

ukaku

누군가 내 OpenGL GLSL 4.0 셰이더로 저를 도와주세요. 내가 가지고있는 문제는 3d (0bj 파일) 가로 드되고 렌더링 될 때 메쉬 파일의 법선을 제외하고 모든 작업 (조명 양호, 메쉬 정점 표시 훌륭함)입니다. 특히, obj 파일이 로컬 / 모델 공간에서 회전 할 때 노멀은 라이트 위치와 현재 방향에 따라 메시에 라이트가 표시되지 않습니다.

문제는 내 일반 매트릭스에 있다고 생각합니다.

문제 : 3D 메쉬가 회전 할 때 조명이 메쉬 업됩니다 (라이트 위치를 반영하지 않음).

어떤 도움이라도 대단히 감사하겠습니다. 미리 감사드립니다

VertexShader

 #version 400
        //Handle translation, projection, etc
        struct Matrix {
            mat4 mvp;
            mat4 mv;
            mat4 view;
            mat4 projection;
        };  
        struct Light {
            vec3 position;
            vec3 color;
            vec3 direction;
            float intensity;
            vec3 ambient;
        };
        //---------------------------------------------------
        //INPUT
        //---------------------------------------------------
        //Per-Vertex Data
        //---------------------------------------------------
        layout (location = 0) in vec3 inputPosition;
        layout (location = 1) in vec3 inputNormal;
        layout (location = 2) in vec3 inputTexture;
        //--------------------------------------------
        // UNIFORM:INPUT Supplied Data from C++ application
        //--------------------------------------------
        uniform Matrix matrix;
        uniform Light light;
        uniform vec3 cameraPosition;

        out vec3 fragmentNormal;
        out vec3 cameraVector;
        out vec3 lightVector;
        out vec2 texCoord;
        void main() {   
            // output the transformed vertex
            gl_Position = matrix.mvp * vec4(inputPosition,1.0);


            //When using, (vec3,0.0)
            mat3 Normal_Matrix = mat3(    transpose(inverse(matrix.mv))  );


            // set the normal for the fragment shader and
            // the vector from the vertex to the camera
            vec3 vertex     = (matrix.mv * vec4(inputPosition,1.0)).xyz;

            //----------------------------------------------------------
            //The problem (i think) is here
            //----------------------------------------------------------
            fragmentNormal  = normalize(Normal_Matrix * inputNormal);
            cameraVector    = (matrix.mv *vec4(cameraPosition,1.0)).xyz - vertex ;


            lightVector = vertex - (matrix.mv * vec4(light.position,1.0)).xyz;  


            //store the texture data
            texCoord = inputTexture.xy;




        }

조각 셰이더

#version 400


const int   NUM_LIGHTS       = 3;
const float     MAX_DIST         = 15.0;
const float     MAX_DIST_SQUARED = MAX_DIST * MAX_DIST;

const vec3 AMBIENT = vec3(0.152, 0.152, 0.152); //0.2 for all component is a good dark value



struct Light {
    vec3 position;
    vec3 color;
    vec3 direction;
    float intensity;
    vec3 ambient;
};

//the image
uniform sampler2D textureSampler;

uniform Light light;

//in: used interpolation, must define both in vertex&fragment shader; 


out vec4 finalOutput;


in vec2 texCoord;   //Texture Coordinate
//in: used interpolation, must define both in vertex&fragment shader; 
in vec3 fragmentNormal;
in vec3 cameraVector;
in vec3 lightVector;

void main() {
    vec4 texColor = texture2D(textureSampler, texCoord);
    // initialize diffuse/specular lighting
    vec3 diffuse =  vec3(0.005f, 0.005f, 0.005f);
    vec3 specular = vec3(0.00f, 0.00f, 0.00f);

    // normalize the fragment normal and camera direction
    vec3 normal     = normalize(fragmentNormal);
    vec3 cameraDir  = normalize(cameraVector);

    // loop through each light

        // calculate distance between 0.0 and 1.0
        float dist = min(dot(lightVector, lightVector), MAX_DIST_SQUARED) / MAX_DIST_SQUARED;
        float distFactor = 1.0 - dist;

        // diffuse
        vec3 lightDir = normalize(lightVector);
        float diffuseDot = dot(normal, lightDir);

        diffuse += light.color * clamp(diffuseDot, 0.0, 1.0) * distFactor;

        // specular
        vec3 halfAngle = normalize(cameraDir + lightDir);
        vec3 specularColor = min(light.color + 0.8, 1.0);
        float specularDot = dot(normal, halfAngle);
        specular += specularColor * pow(clamp(specularDot, 0.0, 1.0), 16.0) * distFactor;


    vec4 sample0 = vec4(1.0, 1.0, 1.0, 1.0);

    vec3 ambDifCombo = (diffuse + AMBIENT);
    //calculate the final color
    vec3 color = clamp(sample0.rgb * ambDifCombo + specular, 0.0, 1.0);

    finalOutput = vec4(color * vec3(texColor), sample0.a);
}

빛의 위치를 ​​바꾸면 안됩니다. 메시가 회전하는 동안 라이트는 고정되어 있어야합니다. 대신 :

lightVector = vertex - (matrix.mv * vec4(light.position,1.0)).xyz; 

이 작업을 수행:

lightVector = vertex - light.position; 

나는 또한 당신의 카메라 위치를 바꾸지 않을 것입니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

메쉬 색상은 아마도 잘못된 정점 노멀 계산으로 인해 엉망이됩니다.

분류에서Dev

CSS EM 측정이 엉망입니까?

분류에서Dev

0 값이 pandas boxplot을 엉망으로 만드는 것을 방지하는 방법은 무엇입니까?

분류에서Dev

C (터미널) 메뉴로 도와주세요. 교수님이 할 수 없으니까요

분류에서Dev

viewForAnnotation 메서드가 사용자의 위치를 엉망으로 만드는 이유는 무엇입니까?

분류에서Dev

블렌더와 Jmonkey간에 애니메이션이 엉망이되는 원인은 무엇입니까?

분류에서Dev

내 C 프로그램을 실행 한 후 항상 0이되는 이유는 무엇입니까? 친절하게 도와주세요

분류에서Dev

카메라 확대 / 축소 움직임이 엉망입니까?

분류에서Dev

이러한 병렬 프로세스의 출력이 엉망이되지 않는 이유는 무엇입니까?

분류에서Dev

위도 값을 엉망으로 만들지 않고 카메라를 대상을 향하도록 회전

분류에서Dev

두 번째 메쉬가있는 이상한 검은 색 얼굴을 가진 GLSL

분류에서Dev

로그인 화면이 왜 그렇게 엉망입니까?

분류에서Dev

tmux가 새 창에 로그인하면 정상적으로 작동하지만 Ubuntu 로그인을 엉망으로 만드는 이유는 무엇입니까?

분류에서Dev

회전없이 하위 변환이 (0,0,0)이되도록 상위 변환을 설정합니다.

분류에서Dev

Ubuntu 13.04 아이콘이 이상해 보입니다. 도와주세요.

분류에서Dev

Ubuntu 13.04 아이콘이 이상해 보입니다. 도와주세요.

분류에서Dev

프로세스에서 엉망으로 만들지 않고 DLLImport를 사용하여 배열을 Fortran DLL에 전달하는 방법은 무엇입니까?

분류에서Dev

열어주세요, 도와주세요! 계정이 작동하지 않습니다. 파이썬

분류에서Dev

엉망인 결과없이 ffmpeg로 2 개의 mp4 비디오를 연결하는 방법은 무엇입니까?

분류에서Dev

addAction은 항상 액터 원점을 0,0으로 회전합니다. 그 이유는 무엇입니까?

분류에서Dev

addAction은 항상 액터 원점을 0,0으로 회전합니다. 그 이유는 무엇입니까?

분류에서Dev

Easus Partition Manager로 인해 Windows 8.1 UEFI 부팅이 엉망이 되었습니까? 오류 코드 : 0xc0000225

분류에서Dev

적절한 회전 애니메이션에 필요한 관점

분류에서Dev

Lightsail 도메인이 시간 초과를 요청하지만 IP는 정상적으로 작동합니다.

분류에서Dev

인텔 8260 업데이트 후 wlan0이 사라졌습니다. 복구를 도와주세요?

분류에서Dev

vtk에서 메쉬의 법선이 메쉬 색상에 따라 다른 이유는 무엇입니까?

분류에서Dev

DE와 엉망이 된 후 DM, 패널, 아이콘 크기 및 인사가 엉망입니다. 이 문제를 어떻게 해결할 수 있습니까?

분류에서Dev

대시가 정규식 검색을 엉망으로 만드는 이유는 무엇입니까?

분류에서Dev

프로그램을 실행할 때 이름 뒤에 두 줄을 입력해야합니까? 도와주세요

Related 관련 기사

  1. 1

    메쉬 색상은 아마도 잘못된 정점 노멀 계산으로 인해 엉망이됩니다.

  2. 2

    CSS EM 측정이 엉망입니까?

  3. 3

    0 값이 pandas boxplot을 엉망으로 만드는 것을 방지하는 방법은 무엇입니까?

  4. 4

    C (터미널) 메뉴로 도와주세요. 교수님이 할 수 없으니까요

  5. 5

    viewForAnnotation 메서드가 사용자의 위치를 엉망으로 만드는 이유는 무엇입니까?

  6. 6

    블렌더와 Jmonkey간에 애니메이션이 엉망이되는 원인은 무엇입니까?

  7. 7

    내 C 프로그램을 실행 한 후 항상 0이되는 이유는 무엇입니까? 친절하게 도와주세요

  8. 8

    카메라 확대 / 축소 움직임이 엉망입니까?

  9. 9

    이러한 병렬 프로세스의 출력이 엉망이되지 않는 이유는 무엇입니까?

  10. 10

    위도 값을 엉망으로 만들지 않고 카메라를 대상을 향하도록 회전

  11. 11

    두 번째 메쉬가있는 이상한 검은 색 얼굴을 가진 GLSL

  12. 12

    로그인 화면이 왜 그렇게 엉망입니까?

  13. 13

    tmux가 새 창에 로그인하면 정상적으로 작동하지만 Ubuntu 로그인을 엉망으로 만드는 이유는 무엇입니까?

  14. 14

    회전없이 하위 변환이 (0,0,0)이되도록 상위 변환을 설정합니다.

  15. 15

    Ubuntu 13.04 아이콘이 이상해 보입니다. 도와주세요.

  16. 16

    Ubuntu 13.04 아이콘이 이상해 보입니다. 도와주세요.

  17. 17

    프로세스에서 엉망으로 만들지 않고 DLLImport를 사용하여 배열을 Fortran DLL에 전달하는 방법은 무엇입니까?

  18. 18

    열어주세요, 도와주세요! 계정이 작동하지 않습니다. 파이썬

  19. 19

    엉망인 결과없이 ffmpeg로 2 개의 mp4 비디오를 연결하는 방법은 무엇입니까?

  20. 20

    addAction은 항상 액터 원점을 0,0으로 회전합니다. 그 이유는 무엇입니까?

  21. 21

    addAction은 항상 액터 원점을 0,0으로 회전합니다. 그 이유는 무엇입니까?

  22. 22

    Easus Partition Manager로 인해 Windows 8.1 UEFI 부팅이 엉망이 되었습니까? 오류 코드 : 0xc0000225

  23. 23

    적절한 회전 애니메이션에 필요한 관점

  24. 24

    Lightsail 도메인이 시간 초과를 요청하지만 IP는 정상적으로 작동합니다.

  25. 25

    인텔 8260 업데이트 후 wlan0이 사라졌습니다. 복구를 도와주세요?

  26. 26

    vtk에서 메쉬의 법선이 메쉬 색상에 따라 다른 이유는 무엇입니까?

  27. 27

    DE와 엉망이 된 후 DM, 패널, 아이콘 크기 및 인사가 엉망입니다. 이 문제를 어떻게 해결할 수 있습니까?

  28. 28

    대시가 정규식 검색을 엉망으로 만드는 이유는 무엇입니까?

  29. 29

    프로그램을 실행할 때 이름 뒤에 두 줄을 입력해야합니까? 도와주세요

뜨겁다태그

보관