OpenGL Stereo: чередование левой и правой текстур

Я работаю с четырехугольным буфером 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++;
}

1

Решение

Я думаю, что следующее должно работать.

Новый фрагмент шейдера:

#version 150 core in vec3 Color;
in vec2 Texcoord;
out vec4 outColor;
uniform sampler2D texIndex;
void main() {
outColor = texture(texIndex, Texcoord);
}

Затем заменить ”texLeft” а также ”texRight” в вашем коде ”texIndex”,

Обратите внимание, что вам не нужно загружать текстуры в каждом кадре, если они статичны. В идеале вы должны поместить все команды, которые должны быть выполнены только один раз, в функцию настройки, которую вы будете выполнять только тогда, когда ОС уведомит окно о смене формы.

1

Другие решения


По вопросам рекламы [email protected]