1

Gluを使用しておらず、視点を設定していないことはわかりますが、McKeesonがhttp://www.arcsynthesis.org/gltut/を使用しているのと同じ正規化されたデバイス座標を使用しているため、彼が取得するのと同じ三角形のみが表示されます。赤。画面が真っ暗になり、警告が表示されません(デバッグのために、glDraw機能を残しておくといいのですが。GL3は、煙が出るまでブラインドで飛ぶようなものです!)。図面のコードは次のとおりです。

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コードを持っている場合、私は上下にグーグルで検索しましたが、何も見つかりませんでした。

デビッドへのコメント:

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

PS。OK、回答ボタンをクリックしなかったことをお詫びします。そんなことがあるとは思いもしませんでした。古い投稿に戻って修正しました。しかし、この質問に対するあなたの答えは、Dav1dがマークを外しています。

4

3 に答える 3

3

申し訳ありませんが、このコードは私を泣かせます。

これはチュートリアルの最初の例 (シェーダーによる) であり、Derelict2 を使用した私の D ソリューション(これも最適なコードではありません) だと思います。ところで、サイズ変更を無効にする必要があります。これはほとんどの場合機能せず、特に初心者にとっては難しくなります。

VAO を使用しないことをお勧めします。まず第一に、VAO を使用するとパフォーマンスがほとんど向上せず、アプリケーションの保守が難しくなり、DSA アプローチと競合します。

さらに、少なくともメッシュをロードするために、OpenGL API 用のある種のラッパーを使用することもお勧めします (チュートリアルでは独自のヘルパーを使用します。再実装したい場合は、多くの作業が必要です!)。私が書いたライブラリであるgljmを使用できます。これは、.obj 形式のメッシュ (sponza シーンを読み込むことができます) と、ply 形式の複雑でないメッシュに対して非常にうまく機能します。

後で vector/matrix/quaternion 数学ライブラリも必要になります。チュートリアルでは glm を使用します (これは C++ テンプレート ライブラリであるため、実際には D に移植することはできません)。gl3nは代替手段になる可能性があります(これも私が書いたものです)。

追伸: 質問するときは、私が評判の娼婦であるという理由だけでなく、人々がすぐに最良の回答を確認できるように、回答を受け入れてください (以前の質問でもこれを行う必要があります)。

PS²: 顔カリングを有効にしたことが原因で問題が発生している可能性があります。

于 2012-04-19T21:19:02.767 に答える
1

DMDサイトのDavidに感謝します。glBufferData(GL_ARRAY_BUFFER、v.length * GL_FLOAT.sizeof、&v、GL_STATIC_DRAW);の&v &v[0]に変更する必要があります。

于 2012-04-22T00:53:53.710 に答える
0

まず、描画関数を呼び出すことはないと思います ( ehub.tick().

于 2012-04-19T21:18:31.587 に答える