Closed. This question is off-topic。它当前不接受答案。
想改善这个问题吗? Update the question,所以它是on-topic,用于堆栈溢出。
7年前关闭。
我正在尝试创建一些隔行扫描图像以在3DTV上输出。我的方法使用OpenGL的模具缓冲区在像素的每一偶数行上绘制一条线网格。在我的笔记本电脑上,生成的图像看起来是隔行扫描的,但是当我输出到3DTV(通过HDMI电缆)时,好像没有在像素的偶数行上画线。我的笔记本电脑和电视的垂直分辨率为1080像素。下面使用的屏幕坐标的范围从屏幕左下角的(-1,-1)到屏幕右上角的(1,1)。这是我用来在模板缓冲区上绘制网格的代码。如果有人可以为我检查一下,以查看我是否做错了什么,我将不胜感激。如果我的代码正确,则问题可能出在电视机调整笔记本电脑输出的大小。
想改善这个问题吗? Update the question,所以它是on-topic,用于堆栈溢出。
7年前关闭。
我正在尝试创建一些隔行扫描图像以在3DTV上输出。我的方法使用OpenGL的模具缓冲区在像素的每一偶数行上绘制一条线网格。在我的笔记本电脑上,生成的图像看起来是隔行扫描的,但是当我输出到3DTV(通过HDMI电缆)时,好像没有在像素的偶数行上画线。我的笔记本电脑和电视的垂直分辨率为1080像素。下面使用的屏幕坐标的范围从屏幕左下角的(-1,-1)到屏幕右上角的(1,1)。这是我用来在模板缓冲区上绘制网格的代码。如果有人可以为我检查一下,以查看我是否做错了什么,我将不胜感激。如果我的代码正确,则问题可能出在电视机调整笔记本电脑输出的大小。
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);
最佳答案
我认为模板缓冲区不是用于此的正确工具。如今,使用片段着色器可以更轻松地进行行隔行扫描。在OpenGL-3之前的日子里,我会使用多边形点画进行此操作(就像我在隔行扫描3D电视补丁中所做的那样,我将其包含在mplayer中)。这样可以节省将几何体放置在正确位置的麻烦。
在着色器中,可以使用gl_FragCoord视口像素坐标作为条件,以像素为单位在两个源图像之间进行选择。或者,您绘制两个通道和行/列的discard
片段。
关于c++ - GLSL隔行扫描似乎跳过了3DTV上的偶数行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9754574/
10-12 14:12