Нарисуйте (2D)изображение в OpenGL

#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. Но, по крайней мере, теперь я наконец-то вижу картинку. Это хорошее место, чтобы начать искать ошибки, так что большое вам спасибо. Но мой мозг на сегодня сломан, и сейчас я посплю. С Днем Благодарения