首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么DerelictGL3什么都不画呢?

为什么DerelictGL3什么都不画呢?
EN

Stack Overflow用户
提问于 2012-04-20 04:49:51
回答 3查看 771关注 0票数 1

我意识到我没有使用Glu,也没有设置透视图,但我使用的是与McKeeson使用http://www.arcsynthesis.org/gltut/相同的归一化设备坐标,所以我应该会看到他得到的相同的三角形,只是红色。我看到一个黑屏,没有任何警告(我希望他们为了调试而保留了glDraw功能;GL3就像是盲目飞行,直到你从烟雾中出来!)。绘图的代码为:

代码语言:javascript
复制
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的代码为:

代码语言:javascript
复制
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代码,并且愿意分享,因为我已经上上下下地搜索过了,但是找不到任何东西。

对David的评论:

正如我所说的,在我能在屏幕上得到一些东西之前,我一直在黑暗中飞行,那么扩展这种黑暗来覆盖模型加载有什么意义呢?我在这里使用的是"BASIC“模板;我已经有了一个用于C#中工作的模型加载器。您链接到的代码是Derelict 1,并且不需要openGL3,据我所知,它需要vao (因此包含它们的原因)。但是,即使没有这个原因,能够在初始化时将vbo绑定到顶点着色器中的属性位置,而不是为每个绘制的vbo的每个循环调用glEnableVertexAttribArray加上glVertexAttribPointer,也是一种节省函数的做法。剔除不是我检查的问题。所以我猜我还在等待一个深思熟虑的答案!

PS。好吧,我很抱歉没有点击应答按钮,我不知道有这样的事情。我已经回顾了以前的帖子,并进行了更正。但是你对这个问题的回答Dav1d没有说中要害。

EN

回答 3

Stack Overflow用户

发布于 2012-04-20 05:19:03

抱歉,这个代码让我哭了。

我猜这是本教程的第一个示例(根据着色器),my D solution with Derelict2 (也不是最好的代码)。顺便说一句,你应该禁用大小调整,这在大多数情况下都不起作用,而且会让事情变得更加困难,特别是对于初学者来说。

我建议你不要使用VAOs,首先,它们几乎不会给你带来性能提升,使你的应用程序更难维护,而且它与DSA approach冲突。

此外,我还建议您为OpenGL应用程序接口使用某种包装器,至少用于加载网格(本教程使用其自己的帮助器,如果您想重新实现它,您有很多工作要做!)。你可以使用gljm,这是我写的一个库,它对.obj格式的网格非常有效(它能够加载sponza场景),也适用于ply格式的非复杂网格。

稍后您还需要一个向量/矩阵/四元数数学库,本教程使用的是glm (您不能真正移植到D,因为它是一个C++模板库)。gl3n可以是另一种选择(也是我写的)。

附言:当你提出问题时,请接受答案,不仅仅是因为我是一个声名狼藉的荡妇,还因为这样人们可以立即看到最好的答案(你也应该对你的老问题这样做)。

PS²:也许你的问题只是因为启用了人脸剔除。

票数 3
EN

Stack Overflow用户

发布于 2012-04-22 08:53:54

多亏了DMD站点的David才找到了答案。glBufferData(GL_ARRAY_BUFFER,v.length * GL_FLOAT.sizeof,&v,GL_STATIC_DRAW);中的&v需要更改为a &v。

票数 1
EN

Stack Overflow用户

发布于 2012-04-20 05:18:32

首先,我不相信你会调用你的绘图函数(除非这是通过ehub.tick()完成的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10236529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档