2012-04-19 70 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

相关问题