2012-04-19 20 views
1

私はGluを使用しておらず、パースペクティブを設定していないことを認識していますが、McKeesonがhttp://www.arcsynthesis.org/gltut/を使用しているのと同じ正規化されたデバイス座標を使用しています。黒い画面が表示され、警告は表示されません(glDraw機能をデバッグ用に残しておきたい、GL3は煙から出るまで盲目的に飛んでいるようなものです)。描画のためのコードは次のとおりです。なぜDerelictGL3は何も描画しないのですか?

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コードを持っている場合は、次の場所が正しくSDLとGLを設定する1.コードを出力結合デバッグ書き込みPOS'であることを

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); 
    } 
}  

注意実際に画面に何かを表示し、共有しようとしていました。なぜなら、私はグーグルで上下に動いていて見つからないからです。

デビッドへのコメント:

に私が言ったように、私は暗い飛んでいます画面上の何かを得ることができるまで、そのモデルの読み込みをカバーするためにその闇を拡張のポイントは何ですか?私はここで "BASIC"テンプレートの後にいます。私はすでにC#の仕事のためのモデルローダーを持っています。あなたがリンクしたコードはDerelict 1であり、私が読んだところではvaoを要求するopenGL3は必要ありません(したがって、それらのインクルードの理由)。しかし、その理由がなくても、初期化時にvboを頂点シェーダ内の属性位置にバインドできるようにするために、glEnableVertexAttribArrayとglVertexAttribPointerを呼び出すとvboを描画するたびにすべてのループが呼び出されます。カリングは私がチェックした問題ではありません。だから私はまだ考えられている答えを待っていると思います!

PS。はい、私は答えられたボタンをクリックしないことについて申し訳なく思っています、私はそのようなことがあったことを認識しませんでした。私は古い投稿に戻って修正しました。しかし、この質問Dav1dへのあなたの答えは印を逃す。手始めに

+0

私はチュートリアルコードのコードをリンクしていましたが、コードが間違っているとは思えないので、これが助けてくれることを期待しましたが、完全なコードは見当たりません。このdynamic_array.sizeofは何かを返します。 – dav1d

答えて

0

、私はそれがehub.tick()を介して行われますしない限り、あなたは(あなたのドロー関数を呼び出します。

+0

ShaderHub.drawメソッドが呼び出されない場合、かなりダムになります – dav1d

+0

そうです。これはEventHubから呼び出されます。 – ste3e

3

申し訳ありません信じていませんが、このコードは私が泣くことができます。

私はこれが最初の例だと思いますチュートリアル(シェイダーによる)、my D solution with Derelict2(ベストコードではありません)Btwでは、サイズ変更を無効にする必要があります。これはほとんどの場合は機能しません。特に初心者の方にとっては難しいことではないでしょうか?

IまずVAOを使用しないことをお勧めします。まず、パフォーマンスをほとんど向上させず、アプリケーションを作成してくださいメンテナンスが難しく、DSA approachと競合します。

OpenGL APIには、少なくともメッシュを読み込むためのラッパーを使用することをお勧めします(チュートリアルでは、独自のヘルパーを使用します。再実装するには、多くの作業が必要です)。​​、私が書いたライブラリを使うことができます。これは、.obj形式のメッシュ(sponzaシーンをロードすることができます)、プライフォーマットの非複合メッシュでもうまくいきます。

また、ベクトル/行列/四元数学ライブラリが必要です。このチュートリアルではglmを使用しています(これはC++のテンプレートライブラリであるため、実際はDに移植できません)。 gl3nは代替(私によっても書かれている)かもしれません。

PS:私が評判の娼婦だからだけでなく、人々がすぐに最高の回答を見ることができるように、質問をするときに回答を受け入れてください(あなたも古い質問でこれを行うべきです)。

PS²:あなたの問題はちょうど顔のカリングを有効にすることによって引き起こされたのかもしれません。

1

DMDサイトのDavidさんのおかげで答えが見つかりました。 glBufferData(GL_ARRAY_BUFFER、v.length * GL_FLOAT.sizeof、& v、GL_STATIC_DRAW)の& v。は、& v [0]に変更する必要があります。

+1

v.ptrを使うこともできます。これは、配列へのポインタではなく、頂点へのポインタではないことをもう少し明示しています(実際、それらは実際には同じものですが、概念的に)。いずれにせよ、これで問題が解決したら、あなた自身の答えを受け入れてください;) – Tim

関連する問題