2012-03-17 2 views
0

Я пытаюсь создать некоторые чересстрочные изображения для вывода на 3DTV. Мой метод использует буфер трафарета OpenGL для рисования сетки строк на каждой четной строке пикселей. На моем ноутбуке результирующее изображение выглядит с чередованием, но когда я выводю на 3DTV (через кабель HDMI), похоже, что строки не нарисованы на каждом четном ряду пикселей. Вертикальное разрешение моего ноутбука и телевизора составляет 1080 пикселей. Используемые ниже координаты экрана варьируются от (-1, -1) для нижнего левого угла экрана до (1, 1) для верхнего правого. Вот код, который я использую, чтобы нарисовать сетку в буфере трафарета. Я был бы признателен, если бы кто-нибудь мог здравомыслием проверить это для меня, чтобы увидеть, что я делаю что-то принципиально неправильно. Если мой код в порядке, проблема может заключаться в изменении размера телевизора на выходе с ноутбука.Переплетение GLSL, кажется, пропускает даже строки на 3DTV

glEnable(GL_STENCIL_TEST); 
glClearStencil(0); 
glClear(GL_STENCIL_BUFFER_BIT); 
glStencilOp (GL_REPLACE, GL_REPLACE, GL_REPLACE); 
glDisable(GL_DEPTH_TEST); 
glStencilFunc(GL_ALWAYS,1,1); 
const int stencilsize = 2500; 
// hardcoding 2500, not the greatest solution in the world i know... 
GLfloat stencilVertices[stencilsize] = {0.0}; 
//if we know the window height, we can draw a line in the stencil buffer on even row of pixels in the window 
currheight = 1080; 
GLint i = 0; 
GLfloat ht = -1; 
/*start ht @ -1, increase by 4/currheight each time, until 1 is reached*/ 
while ((ht < 1) && (i < stencilsize-4)) 
{ 
    stencilVertices[i] = -1; //left edge of screen 
    i++; 
    stencilVertices[i] = ht; //current line's y coord 
    i++; 
    stencilVertices[i] = 1;  //right edge of screen 
    i++; 
    stencilVertices[i] = ht; //current line's y coord 
    i++; 
    ht += 4.0/currheight; //increase ht by (4/(height of window)) each time to mark even rows only (until ht == 1) 
} 
glGenBuffers(1, &m_ui32Stencilpattern); 
glBindBuffer(GL_ARRAY_BUFFER, m_ui32Stencilpattern); 
glBufferData(GL_ARRAY_BUFFER, (stencilsize * sizeof(GLfloat)), stencilVertices, GL_STATIC_DRAW); 
glEnableVertexAttribArray(VERTEX_ARRAY); 
glVertexAttribPointer(VERTEX_ARRAY, 2, GL_FLOAT, GL_FALSE, 0, 0); 
glDrawArrays(GL_LINES, 0, stencilsize); 
+1

@EmileCormier Я не знаю, что это имеет отношение к гамедеву, хотя это и не мусорная корзина для чего-то связанного с графикой. –

+0

@ChristianRau: Я подумал, что там будет больше экспертов OpenGL. –

+0

@Bart: Ой, я предположил, что ему нужен код-обзор, основанный только на его названии. Виноват. –

ответ

1

Я думаю, что буфер трафарета не совсем подходит для этого. Линейное чередование легче сделать с использованием фрагментарного шейдера в наши дни. И в дни перед OpenGL-3 я делал это с использованием полигонального шаблона (как, например, в моем чередующемся 3D-плагине, который я включил в mplayer). Это экономит вашу борьбу с получением вашей геометрии в правильном положении.

В шейдере вы можете выбирать между двумя исходными изображениями на основе каждого пикселя, используя координату пикселя в gl_FragCoord как условное. Или вы рисуете два прохода и discard фрагменты любой строки/столбца.

+0

Спасибо datenwolf. Как вы думаете, фрагментарный шейдерный код вроде: 'if (((myTexCoord/2.0 - vec2 (ivec2 (myTexCoord.y/2.0)))). Y <0.5) \t gl_FragColor = texture2D (leftEyeTexture, myTexCoord); else \t gl_FragColor = texture2D (rightEyeTexture, myTexCoord); 'Должен работать? В данный момент он выводит только текстуру левого глаза. Я думаю, что четная/нечетная проверка требует исправления. К сожалению, у вас нет доступа к операторам «%» или «&». – Stereoscopic

+0

@ Стереоскопическое: Uh, no. Я думал по строке 'if (gl_FragCoord.y% 2 == 0) {gl_FragColor = texture2D (left, ...); } else {texture2D (правый, ...); } '. Помните, что вас интересует чересстрочная развертка экрана/видового экрана, а это означает, что вы хотите основать эту координату пикселя фрагмента. – datenwolf

+0

Я вижу! По вашему предложению я изменил строку if на 'if (((gl_FragCoord/2.0 - vec4 (ivec4 (gl_FragCoord.y/2.0)))). Y <0.5)', похоже, что это работает! Я все еще индексирую свои изображения с помощью «myTexCoord», но все в порядке, не так ли? На данный момент у меня нет 3DTV, поэтому я не могу проверить, но результат похож на то, что я получаю с помощью метода буфера трафарета. Какая разница? Если я подключаюсь к 3DTV через HDMI, это ** должно ** выводить левое изображение на все четные строки, а правильное изображение - на все нечетные, но разве этот метод буферизации тоже не должен был делать? В любом случае, спасибо! :) – Stereoscopic

Смежные вопросы