2012-04-19 3 views
1

나는 Glu를 사용하지 않고 원근감을 설정하지 않는다는 것을 알았지 만 McKeeson이 http://www.arcsynthesis.org/gltut/을 사용하는 것과 같은 정규화 된 장치 좌표를 사용하고 있기 때문에 그가 얻은 동일한 삼각형을 볼 수밖에 없다. 나는 검은 화면과 아무 경고도받지 못한다. (나는 디버깅을 위해 glDraw 기능을 떠났 더라면 좋겠다. GL3은 연기가 날 때까지 블라인드 비행과 같다!). 디버그 쓰기 POS '바인딩 위치가 제대로 SDL을 설정 1. 코드를 인쇄하는 것이왜 DerelictGL3이 무언가를 그립니다.

module ShaderHub; 

import std.stdio; 
import std.string; 
import derelict.opengl3.gl3; 

class ShaderHub{ 
    private bool ok=true; 
    private GLuint shad=0, vshad=0, fshad=0; 
    private int voff=0; 
    private GLuint vbo=0, vao=0; 
    const float[] v = [ 0.75f, 0.75f, 0.0f, 1.0f, 
         0.75f, -0.75f, 0.0f, 1.0f, 
         -0.75f, -0.75f, 0.0f, 1.0f]; 

    public this(){ 
     immutable string vshader = ` 
#version 330 
layout(location = 1) in vec4 pos; 
void main(void) 
{ 
    gl_Position = pos; 
} 
`; 

     immutable string fshader = ` 
#version 330 
void main(void) 
{ 
    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); 
} 
`; 

     shad=glCreateProgram(); 
     if(shad==0){ 
      writeln("Error: GL did not assigh main shader program id"); 
      ok=false; 
     } 

     vshad=glCreateShader(GL_VERTEX_SHADER); 
     const char *vptr=toStringz(vshader); 
     glShaderSource(vshad, 1, &vptr, null); 
     glCompileShader(vshad); 
     int status, len; 
     glGetShaderiv(vshad, GL_COMPILE_STATUS, &status); 
     if(status==GL_FALSE){ 
      glGetShaderiv(vshad, GL_INFO_LOG_LENGTH, &len); 
      char[] error=new char[len]; 
      glGetShaderInfoLog(vshad, len, null, cast(char*)error); 
      writeln(error); 
      ok=false; 
     } 

     fshad=glCreateShader(GL_FRAGMENT_SHADER); 
     const char *fptr=toStringz(fshader); 
     glShaderSource(fshad, 1, &fptr, null); 
     glCompileShader(fshad); 
     glGetShaderiv(vshad, GL_COMPILE_STATUS, &status); 
     if(status==GL_FALSE){ 
      glGetShaderiv(fshad, GL_INFO_LOG_LENGTH, &len); 
      char[] error=new char[len]; 
      glGetShaderInfoLog(fshad, len, null, cast(char*)error); 
      writeln(error); 
      ok=false; 
     } 

     glAttachShader(shad, vshad); 
     glAttachShader(shad, fshad); 
     glLinkProgram(shad); 
     glGetShaderiv(shad, GL_LINK_STATUS, &status); 
     if(status==GL_FALSE){ 
      glGetShaderiv(shad, GL_INFO_LOG_LENGTH, &len); 
      char[] error=new char[len]; 
      glGetShaderInfoLog(shad, len, null, cast(char*)error); 
      writeln(error); 
      ok=false; 
     } 


     glGenVertexArrays(1, &vao); 
     if(vao<1){ 
      writeln("Error: GL failed to assign vao id"); 
      ok=false; 
     } 
     glBindVertexArray(vao); 

     glGenBuffers(1, &vbo); 
     if(vbo<1){ 
      writeln("Error: GL failed to assign vbo id"); 
      ok=false; 
     } 
     glBindBuffer(GL_ARRAY_BUFFER, vbo); 
     glBufferData(GL_ARRAY_BUFFER, v.length * GL_FLOAT.sizeof, &v[0],  GL_STATIC_DRAW); 
     glEnableVertexAttribArray(1); 
     glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, cast(void*)voff);  

     glBindBuffer(GL_ARRAY_BUFFER, 0); 
     glBindVertexArray(0); 
    } 

    public void draw(){ 
     glUseProgram(shad); 

     writeln(glGetAttribLocation(shad, "pos"));//prints 1 

     glBindVertexArray(vao); 
     glDrawArrays(GL_TRIANGLES, 0, 6);  
     glBindVertexArray(0); 


     glUseProgram(0); 
    } 
}  

주와 GL은 다음과 같습니다 : 도면에 대한 코드는

import std.stdio; 
import derelict.sdl2.sdl; 
import derelict.opengl3.gl3; 

import EventHub; 
import ExposeApp; 

pragma(lib, "DerelictUtil.lib"); 
pragma(lib, "DerelictSDL2.lib"); 
pragma(lib, "DerelictGL3.lib"); 


class App{ 
    private ExposeApp funcPtrs; 
    private EventHub ehub; 
    private SDL_Window *win; 
    private SDL_GLContext context; 
    private int w=600, h=480, fov=55; 
    private bool running=true; 

    public this(){ 
     if(!initSDL()){ 
      writeln("Error initializing SDL"); 
      SDL_Quit(); 
     } 
     initGL(); 

     funcPtrs=new ExposeApp(); 
     funcPtrs.stop=&stopLoop; 
     funcPtrs.grabMouse=&grabMouse; 
     funcPtrs.releaseMouse=&releaseMouse; 
     ehub=new EventHub(funcPtrs); 


     while(running){ 
      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

      ehub.tick(); 

      SDL_GL_SwapWindow(win); 
     } 


     SDL_GL_DeleteContext(context); 
     SDL_DestroyWindow(win); 
     SDL_Quit(); 
    } 

    private void stopLoop(){ 
     running=false; 
    } 
    private void grabMouse(){ 
     SDL_ShowCursor(SDL_DISABLE); 
     SDL_SetWindowGrab(win, SDL_TRUE); 
    } 
    private void releaseMouse(){ 
     SDL_ShowCursor(SDL_ENABLE); 
     SDL_SetWindowGrab(win, SDL_FALSE); 
    } 
    private bool initSDL(){ 
     if(SDL_Init(SDL_INIT_VIDEO)< 0){ 
      writefln("Error initializing SDL"); 
      SDL_Quit(); 
      return false; 
     } 

     SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); 
     SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2); 
     SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); 
     SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); 

     win=SDL_CreateWindow("3Doodle", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,  w, h, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN); 
     if(!win){ 
      writefln("Error creating SDL window"); 
      SDL_Quit(); 
      return false; 
     } 

     context=SDL_GL_CreateContext(win); 
     SDL_GL_SetSwapInterval(1); 

     DerelictGL3.reload(); 

     return true; 
    } 
    private void initGL(){ 
     resize(w, h); 

     glEnable(GL_DEPTH_TEST); 
     glEnable(GL_CULL_FACE); 

     glDepthFunc(GL_LEQUAL); 

     glClearColor(0.0, 0.0, 0.0, 1.0); 
     glClearDepth(1.0); 

     glCullFace(GL_BACK); 
     glFrontFace(GL_CCW); 

    } 
    private void resize(int w, int h){ 
     //this will contain the makings of the projection matrix, which we go into next tut 
     glViewport(0, 0, w, h); 
    } 
} 


void main(){ 
    try{ 
     DerelictSDL2.load(); 
    }catch(Exception e){ 
     writeln("Error loading SDL2 lib"); 
    } 
    try{ 
     DerelictGL3.load(); 
    }catch(Exception e){ 
     writeln("Error loading GL3 lib"); 
    } 

    App a=new App(); 
} 

사람이 어떤 Derelict3 openGL3 코드가있는 경우 실제로 화면에 무언가를 표시하고 공유 할 용의가 있습니다. 왜냐하면 저는 위아래로 봤기 때문에 아무 것도 찾을 수 없기 때문입니다. 다윗

코멘트 : 나는 어두운, 그래서 모델 로딩을 충당하기 위해 어둠을 확장하는 점은 무엇입니까 비행하고 화면에 뭔가를 얻을 수있을 때까지

내가 말했듯이? 나는 "기본"템플리트 뒤에있다. 이미 C#의 작업을위한 모델 로더가 있습니다. 링크 된 코드는 Derelict 1이며 openGL3은 필요하지 않습니다. 내가 읽은 바에 따르면 vao를 요구합니다 (포함 이유). 그러나 그 이유가 없더라도 초기화시 vbo를 정점 셰이더의 속성 위치에 바인딩하려면 glEnableVertexAttribArray와 glVertexAttribPointer를 호출하는 대신 모든 vbo에 대한 모든 루프를 호출하는 것이 기능 절약입니다. 도려내는 것은 내가 점검 한 문제가 아니다. 그래서 나는 아직도 생각한 대답을 기다리고 있다고 생각합니다!

추신. 확인 버튼을 클릭하지 않아서 유감입니다. 그런 일이 있다는 것을 깨닫지 못했습니다. 나는 오래되었던 지위를 통하여 되돌아 가게되었고, 고쳤다. 그러나이 질문 Dav1d에 대한 당신의 대답은 표를 그리워합니다.

+0

자습서 코드에 대한 내 코드를 연결 했으므로 코드가 잘못 표시되는 것을 볼 수 없으므로이 코드가 도움이되기를 바랍니다.하지만 전체 코드가 보이지는 않습니다. 한 가지 문제가있을 수 있습니다. 이 dynamic_array.sizeof는 항상 8을 반환합니다. – dav1d

답변

0

우선, 나는. 그이 ehub.tick()를 통해 이루어집니다하지 않는 한 당신이 이제까지 (드로우 함수를 호출

+0

ShaderHub.draw 메서드를 호출하지 않으면 꽤 바보가됩니다 – dav1d

+0

맞습니다. EventHub에서 호출됩니다. – ste3e

3

죄송합니다 생각하지 않지만,이 코드는 나를 울게한다.

을 나는이의 첫 번째 예제 것 같다 자습서 (쉐이더에 따라), my D solution with Derelict2 (가장 좋은 코드는 아닙니다.) Btw, 크기 조절을 비활성화해야합니다. 대부분의 경우 작동하지 않으며 특히 초보자에게 더 어려워집니다.

I VAO를 사용하지 말 것을 권한다. 우선, 성능 향상을 거의 가져 오지 않는다. 유지하기가 더 어려워서 DSA approach과 충돌합니다.

OpenGL API 용 래퍼를 사용하는 것이 좋습니다. 적어도 메시로드 (자습서는 자체 도우미를 사용합니다. 다시 구현하려면 많은 작업이 필요합니다.). 내가 작성한 라이브러리 gljm을 사용할 수 있습니다.이 형식은 .obj 형식의 메쉬 (sponza 장면을로드 할 수 있음)와 플라이 형식의 복잡하지 않은 메쉬에서도 잘 작동합니다.

나중에 벡터/행렬/쿼터니언 수학 라이브러리가 필요합니다.이 튜토리얼에서는 glm (C++ 템플릿 라이브러리이므로 D로 포트 할 수 없음)을 사용합니다. gl3n이 대안이 될 수 있습니다 (나도 작성).

추신 : 내가 평판 창녀이기 때문에뿐만 아니라 사람들이 가장 좋은 답변을 즉시 볼 수 있도록 질문 할 때 답변을 수락하십시오 (이전 질문으로도해야 함).

PS ² : 문제는 방금 얼굴 도려 내기를 사용하여 발생했을 수 있습니다.

1

DMD 사이트의 David 님 덕분에 답변을 찾았습니다. glBufferData의 & v (GL_ARRAY_BUFFER, v.length * GL_FLOAT.sizeof, & v, GL_STATIC_DRAW); v0 [0]으로 변경해야합니다 (&).

+1

v.ptr을 사용할 수도 있습니다. 이것은 포인터를 배열에 전달하는 것이고 꼭지점에 대한 포인터가 아니라는 점을 조금 더 명백하게하기 때문입니다 (예, 실제로는 같은 점을 알고 있지만 서로 다릅니다. 개념). 그러나 어떤 경우에도 문제가 해결되면 직접 답변을 수락하십시오.) – Tim

관련 문제