2012-03-06 34 views
10

मैं पागल हो रहा हूं क्योंकि मैं अपनी स्क्रीन में त्रिकोणों का एक साधारण सेट नहीं बना सकता।डी भाषा में ओपनजीएल 3 के साथ एक साधारण आयताकार प्रस्तुत करना

मैं डी प्रोग्रामिंग भाषा के लिए derelict बाइंडिंग का उपयोग कर OpenGL3 (बहिष्कृत निश्चित पाइपलाइन के बिना) का उपयोग कर रहा हूँ।

क्या आप निम्न प्रोग्राम में त्रुटि को खोज सकते हैं? यह ठीक से संकलित करता है और किसी ओपनजीएल/जीएलएसएल त्रुटि को फेंक नहीं देता है। यह सिर्फ स्पष्ट रंग सेट के साथ एक खाली स्क्रीन दिखाता है।

import std.string; 
import std.conv; 
import derelict.opengl3.gl3; 
import derelict.sdl2.sdl2; 

immutable string minimalVertexShader = ` 
#version 120 
attribute vec2 position; 
void main(void) 
{ 
    gl_Position = vec4(position, 0, 1); 
} 
`; 

immutable string minimalFragmentShader = ` 
#version 120 
void main(void) 
{ 
    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); 
} 
`; 

void main() { 
    DerelictSDL2.load(); 
    DerelictGL3.load(); 

    if (SDL_Init(SDL_INIT_VIDEO) < 0) { 
     throw new Exception("Failed to initialize SDL: " ~ to!string(SDL_GetError())); 
    } 

    // Set OpenGL version 
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); 
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2); 

    // Set OpenGL attributes 
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); 
    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); 

    auto sdlwindow = SDL_CreateWindow("D App", 
     SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 
     640, 480, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN); 

    if (!sdlwindow) 
     throw new Exception("Failed to create a SDL window: " ~ to!string(SDL_GetError())); 

    SDL_GL_CreateContext(sdlwindow); 
    DerelictGL3.reload(); 

    float[] vertices = [ -1, -1, 1, -1, -1, 1, 1, 1]; 
    ushort[] indices = [0, 1, 2, 3]; 
    uint vbo, ibo; 
    // Create VBO 
    glGenBuffers(1, &vbo); 
    glBindBuffer(GL_ARRAY_BUFFER, vbo); 
    glBufferData(GL_ARRAY_BUFFER, vertices.sizeof, vertices.ptr, GL_STATIC_DRAW); 
    glBindBuffer(GL_ARRAY_BUFFER, 0); 

    // Create IBO 
    glGenBuffers(1, &ibo); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo); 
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.sizeof, indices.ptr, GL_STATIC_DRAW); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 

    // Program 
    auto program = glCreateProgram(); 
    // Vertex Shader 
    auto vsh = glCreateShader(GL_VERTEX_SHADER); 
    auto vshSrc = minimalVertexShader.toStringz; 
    glShaderSource(vsh, 1, &vshSrc, null); 
    glCompileShader(vsh); 
    glAttachShader(program, vsh); 
    // Fragment Shader 
    auto fsh = glCreateShader(GL_FRAGMENT_SHADER); 
    auto fshSrc = minimalFragmentShader.toStringz; 
    glShaderSource(fsh, 1, &fshSrc, null); 
    glCompileShader(fsh); 
    glAttachShader(program, fsh); 

    glLinkProgram(program); 
    glUseProgram(program); 

    auto position = glGetAttribLocation(program, "position"); 
    auto run = true; 

    while (run) { 
     SDL_Event event; 
     while (SDL_PollEvent(&event)) { 
      switch (event.type) { 
       case SDL_QUIT: 
        run = false; 
       default: 
        break; 
      } 
     } 

     glClearColor(1, 0.9, 0.8, 1); 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
     glBindBuffer(GL_ARRAY_BUFFER, vbo); 
     glEnableVertexAttribArray(position); 
     glVertexAttribPointer(position, 2, GL_FLOAT, GL_FALSE, vertices.sizeof, null); 
     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo); 
     glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, null); 
     glDisableVertexAttribArray(position); 

     SDL_GL_SwapWindow(sdlwindow); 
    } 
} 
+1

मैं आपको समस्या से क्या नहीं बता सकता हूं, लेकिन अगर आप वास्तव में glGetError() का उपयोग करके ओपनजीएल त्रुटियों की जांच करते हैं तो यह लगभग निश्चित रूप से मदद करेगा। Std.exception में प्रवर्तन फ़ंक्शन देखें और यह आलसी पैरामीटर का उपयोग कैसे करता है - आप ओपनजीएल त्रुटियों को पकड़ना आसान बनाने के लिए इसे 'applyGL()' फ़ंक्शन में अनुकूलित कर सकते हैं। –

+0

मैंने इस कोड का एक संस्करण बनाया जहां मैंने प्रत्येक ग्लो कॉल को 'assert (glGetError() == 0) के साथ चेक किया; 'लाइन ... कुछ भी त्रुटि नहीं हुई। –

+0

आप Derelict को फिर से लोड क्यों कर रहे हैं? : ओ –

उत्तर

13

इस लाइन पर:

glVertexAttribPointer(position, 2, GL_FLOAT, GL_FALSE, vertices.sizeof, null); 

आप सुनिश्चित करें कि आप vertices.sizeof चाहते हैं, जो 16 के एक मूल्य है? डी में, एक गतिशील सरणी दो सदस्यों (ptr और length) के साथ एक संरचना है। आप शायद float.sizeof या float.sizeof * 2 चाहते हैं।

और यह आपके BufferData कॉल के लिए भी जाता है।

+0

उत्तर के लिए धन्यवाद! मैंने उन्हें स्थैतिक सरणी बनाने के लिए घोषणा को बदल दिया (मैंने सोचा था कि उन्हें एक शाब्दिक के साथ परिभाषित किया गया था, वे स्थैतिक होंगे) और अब .sizeof 'vertices' के लिए 32 (लंबाई * float.sizeof) और 8 'सूचकांक' के लिए 8 है। लेकिन फिर भी मुझे कुछ भी नहीं मिला है। :( –

+0

ओह रुको, आप बहुत ही अच्छे हैं। मैंने 'vertices.sizeof' को' vertices.length * float.sizeof' के साथ glBufferData कॉल में बदल दिया, वही 'इंडेक्स' के साथ। लेकिन 'glVertexAttribPointer' में मुझे '2 * flat.sizeof' को स्ट्रैड पैरामीटर के रूप में। यह काम करता है !! धन्यवाद! –

+0

@ सैंटियागोवी। अरे, मैं शुरू करने में मदद करने के लिए आपके उदाहरण का उपयोग करने में सक्षम था (एसडीएल का उपयोग नहीं कर रहा)। मुझे पता है कि यह पुराना है लेकिन जब मैंने इसे किया , मैं सिर्फ एक खिड़की थी जो रंगीन थी ... जैसे कि त्रिकोण खिड़की से बड़ा रास्ता था। उस पर कोई विचार है? – AbstractDissonance