2012-04-19 73 views
1

我意識到我沒有使用Glu,也沒有設置透視圖,但我使用與McKeeson使用的相同的標準化設備座標http://www.arcsynthesis.org/gltut/,所以我應該看到他得到的同一個三角形,只有紅色。我得到了一個黑屏,並沒有警告(我希望他們離開glDraw功能進行調試; GL3就像飛行盲人,直到你離開煙霧!)。用於繪製的代碼是:爲什麼不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); 
    } 
}  

注意,調試寫作POS'結合位置正確打印1.代碼設置SDL和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#工作的模型加載器。你鏈接到的代碼是廢棄1,並不需要openGL3,從我讀的,要求vao(因此他們包括的原因)。但即使沒有這個理由,爲了能夠在初始化時將vbo綁定到頂點着色器中的屬性位置,而不是讓每個循環的glEnableVertexAttribArray加上glVertexAttribPointer調用來繪製每個vbo,這是一個函數保存。剔除不是我檢查的問題。所以我想我還在等待一個考慮的答案!

PS。好吧,我很抱歉沒有點擊答覆的按鈕,我沒有意識到有這樣的事情。我已經回到舊帖子並更正了。但是你對這個問題的回答Dav1d忽略了這個標記。

+0

我沒有鏈接你我的教程代碼代碼,我希望這會有所幫助,因爲我看不出你的代碼有什麼問題,但是我們也看不到完整的代碼,有一個問題可能是該dynamic_array.sizeof返回away 8. 8. – dav1d 2012-04-20 17:28:12

回答

0

對於初學者來說,我不相信你曾經打電話給你繪製函數(除非威盛ehub.tick()完成。

+0

如果這不會調用ShaderHub.draw方法 – dav1d 2012-04-19 21:22:20

+0

這是對的。它從EventHub中調用。 – ste3e 2012-04-19 23:02:17

3

對不起,但是這個代碼讓我哭。

我想這是第一個例子該教程(根據着色器),my D solution with Derelict2(也不是最好的代碼)。順便說一句,你應該禁用調整大小,這不工作大部分時間,使事情變得更難,尤其是對於初學者。建議你不要使用VAO,首先,它們幾乎不會提升性能,讓你的應用程序難以維持,並與DSA approach相沖突。另外我還建議你使用某種包裝的OpenGL API,至少對於加載網格(教程使用自己的助手,如果你想重新實現它,你有很多工作!)。你可以使用​​,這是我寫的一個庫,對於.obj格式的網格(它可以加載sponza場景),對於網格格式中的非複雜網格也適用。

後來你還需要一個vector/matrix/quaternion數學庫,本教程使用glm(你不能真正移植到D,因爲它是一個C++模板庫)。 gl3n可能是一個替代品(也由我寫)。 PS:當你提出問題時,請接受答案,這不僅僅是因爲我是一個聲譽妓女,而且也是爲了讓人們能夠立即看到最好的答案(你也應該在你的老問題中這樣做)。

PS²:也許你的問題是由啓用面部剔除造成的。

1

找到了答案,感謝大衛在DMD網站。 glBufferData中的& v(GL_ARRAY_BUFFER,v.length * GL_FLOAT.sizeof,&v,GL_STATIC_DRAW);需要更改爲& v [0]。

+1

你也可以使用v.ptr,因爲這使得它更明確一點,你傳遞的是一個指向數組的指針而不是指向頂點的指針(是的,我意識到它們在實踐中是相同的,但它們是不同的在概念上)。無論如何,如果這解決了您的問題,請繼續並接受您自己的答案;) – Tim 2012-04-25 16:17:50

相關問題