2016-08-30 3 views
0

OpenGL과 Im을 학습하면 Im은 붉은 색 삼각형을 그리지 만 삼각형은 검정색을 유지합니다. 조각 쉐이더에서 색상을 바꿀 수 없습니다

내 조각 쉐이더의 코드입니다 :

#version 330 core 

out vec4 color; 

void main() 
{ 
    color = vec4(1,0,0,1); 
} 

그리고 내 쉐이더는 내가 사용 쉐이더이 클래스를 사용하여 문제없이 컴파일 :

public class ShaderProgram 
{ 
    private final int programId; 

    private int vertexShaderId; 

    private int fragmentShaderId; 

    public ShaderProgram() throws Exception 
    { 
     programId = glCreateProgram(); 
     if (programId == 0) { 
      throw new Exception("Could not create Shader"); 
     } 
    } 

    public void createVertexShader(String shaderCode) throws Exception { 
     vertexShaderId = createShader(shaderCode, GL_VERTEX_SHADER); 
    } 

    public void createFragmentShader(String shaderCode) throws Exception { 
     fragmentShaderId = createShader(shaderCode, GL_FRAGMENT_SHADER); 
    } 

    protected int createShader(String shaderCode, int shaderType) throws Exception { 
     int shaderId = glCreateShader(shaderType); 
     if (shaderId == 0) { 
      throw new Exception("Error creating shader. Code: " + shaderId); 
     } 

     glShaderSource(shaderId, shaderCode); 
     glCompileShader(shaderId); 

     if (glGetShaderi(shaderId, GL_COMPILE_STATUS) == 0) { 
      throw new Exception("Error compiling Shader code: " + glGetShaderInfoLog(shaderId, 1024)); 
     } 

     glAttachShader(programId, shaderId); 

     return shaderId; 
    } 

    public void link() throws Exception { 
     glLinkProgram(programId); 
     if (glGetProgrami(programId, GL_LINK_STATUS) == 0) { 
      throw new Exception("Error linking Shader code: " + glGetShaderInfoLog(programId, 1024)); 
     } 

     glValidateProgram(programId); 
     if (glGetProgrami(programId, GL_VALIDATE_STATUS) == 0) { 
      System.err.println("Warning validating Shader code: " + glGetShaderInfoLog(programId, 1024)); 
     } 

    } 

    public void bind() { 
     glUseProgram(programId); 
    } 

    public void unbind() { 
     glUseProgram(0); 
    } 

    public void cleanup() { 
     unbind(); 
     if (programId != 0) { 
      if (vertexShaderId != 0) { 
       glDetachShader(programId, vertexShaderId); 
      } 
      if (fragmentShaderId != 0) { 
       glDetachShader(programId, fragmentShaderId); 
      } 
      glDeleteProgram(programId); 
     } 
    } 
} 

다음이 내 게임 클래스입니다 :

public class Game { 

    int vertexArrayID; 
    int vertexBufferID; 

    ShaderProgram fragmentShader; 
    ShaderProgram vertexShader; 

    float[] vertexData = 
     { 
      -1.0f, -1.0f, 0.0f, 
      1.0f, -1.0f, 0.0f, 
      0.0f, 1.0f, 0.0f, 
     }; 

    FloatBuffer vertexBuffer; 

    public Game() throws Exception { 
     vertexArrayID = glGenVertexArrays(); 
     glBindVertexArray(vertexArrayID); 

     vertexBufferID = glGenBuffers(); 
     glBindBuffer(GL_ARRAY_BUFFER, vertexBufferID); 

     vertexBuffer = BufferUtils.createFloatBuffer(vertexData.length); 
     vertexBuffer.put(vertexData); 
     vertexBuffer.flip(); 

     glBufferData(GL_ARRAY_BUFFER, vertexBuffer,GL_STATIC_DRAW); 

     fragmentShader = new ShaderProgram(); 
     vertexShader = new ShaderProgram(); 

     fragmentShader.createFragmentShader(loadShader("fragmentShader.glsl")); 
     vertexShader.createVertexShader(loadShader("vertexShader.glsl")); 

     fragmentShader.link(); 
     vertexShader.link(); 
    } 

    public void update() 
    { 
     fragmentShader.bind(); 
     vertexShader.bind(); 

     glEnableVertexAttribArray(0); 
     glBindBuffer(GL_ARRAY_BUFFER,vertexBufferID); 
     glVertexAttribPointer(0,3,GL_FLOAT,false,0,0); 

     glDrawArrays(GL_TRIANGLES,0,3); 
     glDisableVertexAttribArray(0); 

     fragmentShader.unbind(); 
     vertexShader.unbind(); 
    } 

    private String loadShader(String input) { 
     String r = ""; 

     try { 
      BufferedReader reader = new BufferedReader(new InputStreamReader(Game.class.getResourceAsStream("/shaders/" + input))); 
      String buffer = ""; 
      while ((buffer = reader.readLine()) != null) { 
       r += buffer + "\n"; 
      } 
      reader.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return r; 
    } 
} 

내 삼각형은 그 이후 검은 머물 이유는 무엇입니까?

+3

적절한 [mcve]를 제공하십시오. 이 문제를 제대로 진단하기에 충분하지 않은 정보입니다. 특히 쉐이더/프로그램이 초기화되고 사용되는 방식을 보는 것이 중요합니다. OpenGL을 배우고 있다고 주장하기 때문에 문제없이 "호스트"(즉 C++) 코드 전체를 포함 할 수 있어야합니다. – Xirema

답변

6

당신의 OpenGL에서 프로그램 및 쉐이더의 사용을 오해하신 것 같습니다.

Shader 개체는 OpenGL의 "Shader Stages", 즉 Vertex Shader 또는 Fragment Shader 또는 OpenGL 그래픽 파이프 라인의 다른 프로그래밍 가능한 스테이지 중 하나에 해당합니다.

Program 개체는 조립식 체인 쉐이더 스테이지에 해당하며 때로는 구식 쉐이더라고도합니다. 프로그램에서

은, 그러나, 당신은 두 개의 프로그램을 만드는 일을 하나에 버텍스 쉐이더를 부착하고 다른 프래그먼트 쉐이더를 부착하고, 둘 다 사용하는 것을 나타납니다. 내 지식으로는 OpenGL에서 오류를 발생시키지 않습니다 (누락 된 단계에 대해 기본 통과 셰이더 만 사용함). 즉, 해당 단계 중 하나만 활성화되어 언제든지 활성화 될 수 있음을 의미합니다. 다른 하나. 귀하의 경우에는, 당신의 update 기능의 코드 :

당신의 조각 쉐이더을 변경하게 된 이유에만 버텍스 쉐이더를 사용하고
fragmentShader.bind(); 
vertexShader.bind(); 

수단은 어떤 영향을하지 않습니다.

이 문제를 해결하려면 ShaderProgram 개체를 하나만 만들고이 개체에 Vertex 및 Fragment 셰이더 소스 코드를 모두 create[X]Shader을 호출하여 첨부하십시오. 한 번 연결 한 다음 update 함수에서 use을 한 번만 호출하십시오. 이 작업을 수행하면 프로그램이 예상대로 작동합니다.

+0

설명해 주셔서 감사합니다. – JohnyBro

관련 문제