2017-11-22 21 views
-1

을 사라지게 정확히 그 의미에 : 심지어 최대한 빨리 버텍스 쉐이더를 사용하지만 Working as intended버텍스 쉐이더는 GUI 내가 GUI의 렌더링하는 몇 가지 코드를 가지고 있고, 그때 버텍스 쉐이더를 사용 해달라고 경우는 렌더링

, 단순히 그것은 내 GUI가

사라하게, 그렇지 않으면 숨 깁니다, 또는 이동, 또는

gl_position = vec4(position,1.0);

호출 한 뭐죠는 OpenGL에서 GUI를위한 셰이더를 가지고있는 올바른 방법?

glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 

    glOrtho(0, width, 0, height, -10, 10); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glDisable(GL_CULL_FACE); 
    glDisable(GL_DEPTH_TEST); 
    RendererUtils.setWireframeMode(false); 
    for (Interface i : interfaces) 
    { 
     i.updateShaderForThisB(); 
     if (i instanceof InterfaceContainer) 
     { 
      ((InterfaceContainer) i).draw(); 
     } 
     else 
     { 
      ((InterfaceControl) i).draw(); 
     }   
    } 
    InterfaceShader.getInstance().unbind(); 
    glEnable(GL_DEPTH_TEST); 
    glEnable(GL_CULL_FACE); 

InterfaceContainer 및 InterfaceControl의 무승부 호출이 거의 같은, 그래서 나는 단지 그들 중 하나를 추가 할 것입니다 :

GUI 렌더링합니다.

InterfaceControl.draw()

public void draw() 
{ 
    this.updateShaderForThisB(); 
    this.getMesh().draw(); 
    if (this.hasText) 
    { 
     //this.updateShaderForThisF(); 
     //drawText(); 
    } 

} 

InterfaceControl.updateShaderForThisB()

public void updateShaderForThisB() 
{ 
    InterfaceShader shader = InterfaceShader.getInstance(); 
    shader.bind(); 
    shader.setColour(this.getActingColour()); 
    shader.setLocation(this.getLocation()); 
    shader.setSize(this.getBounds()); 
    shader.setGradient(this.getShouldGradient()); 
    shader.updateUniforms(); 
} 

Mesh.draw()

public void draw() 
{ 
    glEnableVertexAttribArray(0); //Vertices 
    glEnableVertexAttribArray(1); //Tex coords 
    glEnableVertexAttribArray(2); //Normals 

    glBindBuffer(GL_ARRAY_BUFFER,vbo); 
    glVertexAttribPointer(0, 3, GL_FLOAT, false, Vertex.SIZE * 4, 0); 
    glVertexAttribPointer(1, 2, GL_FLOAT, false, Vertex.SIZE * 4, 12); 
    glVertexAttribPointer(2, 3, GL_FLOAT, false, Vertex.SIZE * 4, 20); 

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo); 
    glDrawElements(GL_TRIANGLES, size, GL_UNSIGNED_INT,0); 

    glDisableVertexAttribArray(0); 
    glDisableVertexAttribArray(1); 
    glDisableVertexAttribArray(2); 
} 

InterfaceShader.vs

#version 330 

layout(location = 0) in vec3 position; 
layout(location = 1) in vec2 texCoord; 
uniform mat4 viewMatrix; 

out vec2 texCoord0; 

void main() 
{ 
    gl_Position = viewMatrix * vec4(position,1.0); 
    texCoord0 = texCoord; 
} 
,

누구나 내가 간과 한 명백한 문제를 볼 수 있습니까? 내 첫번째 생각은 쉐이더가 현실 세계에 내 인터페이스 중심의 좌표를 (예 : 50,50,1) 좌표 번역되었다, 그러나 나는

편집 몰라 : 요청으로 업데이트 된 쉐이더 코드 및 매트릭스 투사 코드

추가 는

https://pastebin.com/gKdewDVi

뷰 매트릭스 및를 얻기위한 클래스 변환 용 페이스트 빈, 그것은 셰이더

+3

> 누구나 내가 간과 한 명백한 문제를 볼 수 있습니까? 예. OpenGL 매트릭스 스택을 사용하여 변환 작업을 수행하고 있습니다. 버텍스 쉐이더없이 렌더링 할 때 기본/내장 고정 함수 파이프 라인이 해당 행 스택 변환을 설명하지만, 지나치게 간단한 사용자 정의 버텍스 쉐이더는 그렇지 않습니다. 단순히 모델 공간 좌표를 가져 와서이를 클립 공간 좌표로 출력합니다. OpenGL 렌더링 파이프 라인과 셰이더 작동 방식에 대해 읽어야합니다. – httpdigest

+0

뭔가 간단 할 것이라고 알고, 내 다른 셰이더가 잘 작동하지만 나는 어떤 변형이 꼭지점에서 발생하기를 원하지 않기 때문에이 행렬에 어떤 행렬이 필요하지 않다고 생각했습니다. – DuskFall

답변

1

고정 기능 정점 처리 파이프 라인 GL_PROJECTION * GL_MODELVIEW 주어진 현재 행렬 정점 위치를 곱하고 다시 관련이되다. 지금처럼 버텍스 쉐이더에서 You have to do the same thing :

gl_Position=gl_ModelViewProjectionMatrix * vec4(position,1.0); 

당신은 고정 기능 처리를 사용하여 오래된 OpenGL을 프로그래밍 방식을 사용하고 있습니다. 이 기능은 현재 사용되지 않습니다. 당신이 정말로 옛날 취급 및 Fixed Function Pipeline 사용되지 않는 셰이더 프로그램을 사용하려면

+0

변환 된 뷰 매트릭스를 통과하고 있습니다. 월드 스페이스를 사용하는 대신 인터페이스의 각 개별 부분에 변환을 적용하고 그리기 당 하나의 바인딩을 바인딩해야합니까, 아니면 단일 변환을 지정하고이를 셰이더로 보내고 변경하기 전까지 적용되도록 할 수 있습니까? ? – DuskFall

+0

버텍스 쉐이더 코드 – bernie

0

, 다음 버텍스 쉐이더는 ...이 :

#version 110 

varying vec2 texCoord0; 

void main(void) 
{ 
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vetex; 
    // or: gl_Position = ftransform(); 

    vec4 texCoord = gl_TextureMatrix * gl_MultiTexCoord0; 
    texCoord0  = texCoord.xy; 
} 


그러나이 같을 것이다

코드에서 직교 투영을 설정합니다.Fixed Function Pipeline에서

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 

glOrtho(0, width, 0, height, -10, 10); 

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

각 정점은 모델 뷰 매트릭스와 투영 매트릭스로 변환된다 : 모델 뷰 매트릭스는 항등 행렬이다. 버텍스 쉐이더를 사용한다면 버텍스 쉐이더에서 같은 변환을해야합니다.

는 Declarate는 버텍스 셰이더와 클립 공간 출력 위치 gl_Position 행렬에 의해 정점을 변환하고 설정 'mat4 u_mvp'모델 뷰 투영 매트릭스 균일 변수 :

#version 330 

layout(location = 0) in vec3 position; 
layout(location = 1) in vec2 texCoord; 

out vec2 texCoord0; 

uniform mat4 u_mvp; 

void main() 
{ 
    texCoord0 = texCoord; 
    gl_Position = u_mvp * vec4(position.xyz, 1.0); 
} 

를 sahder 프로그램이 연결되면 glLinkProgram에 의해, 당신은 glGetUniformLocation하여 unform 위치를 얻을 수 있습니다 : 프로그램이 glUseProgram으로 설치됩니다

GLuint shaderProgObj; // the linked shader program object 

GLint mvp_location = glGetUniformLocation(shaderProgObj, "u_mvp"); 

후에는 0,123,690,965하여 균일 한 변수를 설정해야 매트릭스 설정 및 내가 glm OpenGL Mathematics 같은 라이브러리를 사용하는 것이 좋습니다 조작의

GLfloat mvp[16]; 

glUniformMatrix4fv(mvp_location, 1, GL_FALSE, mvp; 

(AN orthograohic 돌출부는 glm::ortho으로 설정할 수 있습니다).

직교 프로젝션 매트릭스는 다음과 같다 :

GLfloat r = 0.0; // right 
GLfloat l = width; // left 
GLfloat b = 0.0; // right 
GLfloat t = height; // left 
GLfloat n = -10.0; // top 
GLfloat f = 10.0; // bottom 

GLfloat mvp[16] { 
    2.0f/(r-l), 0.0f,   0.0f,  0.0f, 
    0.0f,   2.0f/(t-b), 0.0f,  0.0f, 
    0.0f,   0.0f,  -2.0/(f-n), 0.0f, 
    -(r+l)/(r-l), -(t+b)/(t-b), -(f+n)/(f-n), 1.0f, 
} 

참고, 당신은 모델 뷰 행렬을 사용하는 경우, 당신은 모델 뷰 투영 행렬에 모델 뷰 변환을 추가해야 할 것입니다.
도 참조하십시오. Perspective projection and view matrix in OpenGL.

+0

으로 질문을 업데이트하십시오. 다른 의견을 읽은 후, 고정 파이프 라인을 현대 gl과 섞어 놓았 기 때문에 필자는 느낌이 들었습니다. 내일 나는 그것을 제거하고 추가 할 것입니다. 그것은 내 변환 클래스에, 즉, 내 셰이더를 사용하기위한 오쏘 구현을 추가한다. – DuskFall