#c #image #opengl #glfw
Вопрос:
Я застрял на простом рисовании изображения в окне OpenGL.
Я использую GLEW и GLFW.
Мой код выглядит так (его часть):
GLuint VertexArrayID; glGenVertexArrays(1, amp;VertexArrayID); glBindVertexArray(VertexArrayID); GLuint shader = CreateShaders("something"); // Compiles and does OpenGL-Stuff (I checked - it works) glClearColor(0.5f, 0.0f, 0.0f, 0.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glUseProgram(shader); GLuint vertexBuffer; glGenBuffers(1, amp;vertexBuffer); glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); //g_vertex_buffer_data and g_uv_buffer_data are from the tutorial glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW); GLuint uvbuffer; glGenBuffers(1, amp;uvbuffer); glBindBuffer(GL_ARRAY_BUFFER, uvbuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(g_uv_buffer_data), g_uv_buffer_data, GL_STATIC_DRAW); GLuint textureID; glGenTextures(1, amp;textureID); glBindTexture(GL_TEXTURE_2D, textureID); // Data is a 1200 x 1000 x 3 char array (for testing purposes containing the mandelbrot set) glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1200, 1000, 0, GL_BGR, GL_UNSIGNED_BYTE, Data); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, textureID); glUniform1i(glGetUniformLocation(vfShader, "MandelbrotImg"), 0); glEnableVertexAttribArray(0); glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); glEnableVertexAttribArray(1); glBindBuffer(GL_ARRAY_BUFFER, uvbuffer); glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (void*)0); glDrawArrays(GL_TRIANGLES, 0, 12*3); glDisableVertexAttribArray(0); glDisableVertexAttribArray(1);
Шейдер фрагментов:
#version 430 core in vec2 UV; out vec3 color; uniform sampler2D MandelbrotImg; void main() { color = texture(MandelbrotImg, UV).rgb; }
Вершинный шейдер:
#version 430 core layout(location = 0) in vec3 vertexPosition_modelspace; layout(location = 1) in vec2 vertexUV; out vec2 UV; void main() { gl_Position = vec4(vertexPosition_modelspace, 1); UV = vertexUV; }
Кстати: изображение создается вычислительным шейдером, так что, по крайней мере, это работает (но я также протестировал здесь только некоторые простые данные, сгенерированные на C , чтобы увидеть что-нибудь…)
Комментарии:
1. Ладно, ребята, теперь я НАКОНЕЦ-то кое-что вижу. Выглядит не так, как должно быть, но, вероятно, это цветовые компоненты, которые должны быть плавающими. Я попробую это сейчас
2. ну… поскольку (как указал @Rabbid76) вы используете
GL_UNSIGNED_BYTE
в качестве формата текстуры, поплавки-это не то, что ожидается. Просто попробуйтеData
заполнить что-нибудь разумное, чтобы вы могли убедиться, что генерируемые вами данные на самом деле являются тем, что отбирается.3. Итак, я заполняю данные изображением набора Мандельброта. Я также показываю его через CImg, где он выглядит так, как должен. Когда я использую склеивания, я могу «немного» видеть набор, но едва (только некоторые пиксели кажутся правильными, а отдельные изображения кажутся «смешанными»). Когда я использую поплавки, я вижу набор в основном в черном цвете, а контуры в некоторых цветах. Также текстура нарисована на кубе (я использовал эту форму в учебнике и хотел позже изменить ее на прямоугольник). Две другие стороны, которые я вижу, имеют более светло-серый оттенок, но в остальном выглядят одинаково. Итак, это проблема с g_vertex_buffer_data или g_uv_buffer_data?
4. Если вы видите что-то, что напоминает правильный шаблон / форму ваших исходных данных, то это может быть проблемой масштаба. Если вы берете данные изображения, которые находятся в диапазоне 0..1 с плавающей точкой, и неправильно преобразуете их в диапазон 0..255 (поскольку вы используете
GL_UNSIGNED_BYTE
), то в лучшем случае вы получите что-то очень тусклое.5. Я изменил GL_UNSIGNED_BYTE на GL_FLOAT. Циклический просмотр данных изображения просто делает изображение ярче. Я попробую то же самое завтра с GL_UNSIGNED_BYTE. Но, по крайней мере, теперь я наконец-то вижу картинку. Это хорошее место, чтобы начать искать ошибки, так что большое вам спасибо. Но мой мозг на сегодня сломан, и сейчас я посплю. С Днем Благодарения