मैं पागल हो रहा हूं क्योंकि मैं अपनी स्क्रीन में त्रिकोणों का एक साधारण सेट नहीं बना सकता।डी भाषा में ओपनजीएल 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);
}
}
मैं आपको समस्या से क्या नहीं बता सकता हूं, लेकिन अगर आप वास्तव में glGetError() का उपयोग करके ओपनजीएल त्रुटियों की जांच करते हैं तो यह लगभग निश्चित रूप से मदद करेगा। Std.exception में प्रवर्तन फ़ंक्शन देखें और यह आलसी पैरामीटर का उपयोग कैसे करता है - आप ओपनजीएल त्रुटियों को पकड़ना आसान बनाने के लिए इसे 'applyGL()' फ़ंक्शन में अनुकूलित कर सकते हैं। –
मैंने इस कोड का एक संस्करण बनाया जहां मैंने प्रत्येक ग्लो कॉल को 'assert (glGetError() == 0) के साथ चेक किया; 'लाइन ... कुछ भी त्रुटि नहीं हुई। –
आप Derelict को फिर से लोड क्यों कर रहे हैं? : ओ –