Я работаю с четырехугольным буфером openGL для рендеринга стерео 3D-изображений (и я очень новичок в openGL).
Я столкнулся с вопросом о том, как определить выходную текстуру для каждого заднего буфера, который я предлагаю сделать в буфере фрагментов, определив выходной цвет (соответствующий указанной текстуре).
Вот код, который я использую для источников шейдеров:
// Shader sources
const GLchar* vertexSource =
"#version 150 core\n""in vec2 position;""in vec3 color;""in vec2 texcoord;""out vec3 Color;""out vec2 Texcoord;""void main() {"" Color = color;"" Texcoord = texcoord;"" gl_Position = vec4(position, 0.0, 1.0);""}"; // Vertex buffer source
const GLchar* fragmentSource =
"#version 150 core\n""in vec3 Color;""in vec2 Texcoord;""out vec4 outColor;""uniform sampler2D texRight;""uniform sampler2D texLeft;""void main() {"" outColor = texture(texRight, Texcoord);"" outColor = texture(texLeft, Texcoord);""}"; // Fragment buffer source
Это код, который я использую для заполнения обратных буферов, который я использую в функции отображения для контекстного окна freeglut.
// Clear Buffers
glDrawBuffer(GL_BACK);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(0.0f, 0.0f, 0.0f,1.0f);
cudaGLMapBufferObject((void**)d_glpointer, pbo);
cudaGLMapBufferObject((void**)d_glpointer, pbo_Right);
//...
// Unmap buffer object
cudaGLUnmapBufferObject(pbo);
glBindBuffer( GL_PIXEL_UNPACK_BUFFER, pbo);
glDrawBuffer(GL_BACK_LEFT);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, texturesID[1]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, image_width, image_height, 0, GL_RGBA, GL_UNSIGNED_BYTE,NULL); // NULL specifies that the image is in memory
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glUniform1i(glGetUniformLocation(shaderProgram, "texLeft"), 1);
// Draw a rectangle from the 2 triangles using 6 indices
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);// Unmap buffer object
cudaGLUnmapBufferObject(pbo_Right);
glBindBuffer( GL_PIXEL_UNPACK_BUFFER, pbo_Right);
// Draw Back Buffers
glDrawBuffer(GL_BACK_RIGHT);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texturesID[0]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, image_width, image_height, 0, GL_RGBA, GL_UNSIGNED_BYTE,NULL); // NULL specifies that the image is in memory
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glUniform1i(glGetUniformLocation(shaderProgram, "texRight"), 0);
// Draw a rectangle from the 2 triangles using 6 indices
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
// Swap buffers
glutSwapBuffers();
Используя этот код, я могу видеть только последний определенный цвет, но я не смог найти функциональный способ выбора между определением outColor в зависимости от используемого буфера.
Я использую Cuda, чтобы поместить изображения в память, но проблема, похоже, не связана с этим отображением, так как я всегда могу видеть изображение, связанное с текстурой, определенной последней, во внешнем цвете шейдера.
Я буду признателен за помощь в выяснении этого.
Изменить 1:
Я добавил счетчик в шейдер, который проверяет, является ли количество кадров (texCount) четным или нечетным. Хотя у меня сейчас нет выходного изображения.
#version 150 core
in vec3 Color;
in vec2 Texcoord;
out vec4 outColor;
uniform sampler2D texRight;
uniform sampler2D texLeft;
uniform int texCount=1;
void main() {
if (texCount%2){ // if texCount division by two is exact then this is false
outColor = texture(texLeft, Texcoord);
}else{
outColor = texture(texRight, Texcoord);
}
texCount++;
}
Я думаю, что следующее должно работать.
Новый фрагмент шейдера:
#version 150 core in vec3 Color;
in vec2 Texcoord;
out vec4 outColor;
uniform sampler2D texIndex;
void main() {
outColor = texture(texIndex, Texcoord);
}
Затем заменить ”texLeft”
а также ”texRight”
в вашем коде ”texIndex”
,
Обратите внимание, что вам не нужно загружать текстуры в каждом кадре, если они статичны. В идеале вы должны поместить все команды, которые должны быть выполнены только один раз, в функцию настройки, которую вы будете выполнять только тогда, когда ОС уведомит окно о смене формы.