【发布时间】:2019-05-16 15:08:51
【问题描述】:
我正在做一个项目,我必须将来自分辨率为 640x480 的相机的数据以纵向模式投射到 4K 屏幕上。
相机是 Kinect V1,但我会切换到分辨率更高的版本 2 (1920x1080)。
我的问题是如何更改要显示的纹理的比例以获得正确的结果。 目前,我已经设法在整个屏幕上显示,但图像的宽度是扁平的。理想的情况是保持比例并在图像的每一侧切割一个 X 宽度。
我正在使用 SDL 和 OpenGL,这里是代码的相关部分:
// window creation
auto window = SDL_CreateWindow("Imagine",
x,
y,
0,
0,
SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN | SDL_WINDOW_FULLSCREEN_DESKTOP | SDL_WINDOW_ALLOW_HIGHDPI | SDL_WINDOW_BORDERLESS);
// GL initialization and texture creation
void SdlNuitrackRenderHandler::initTexture(int width, int height)
{
glEnable(GL_TEXTURE_2D);
glEnableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
glOrtho(0, _width, _height, 0, -1.0, 1.0);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glGenTextures(1, &_textureID);
width = power2(width);
height = power2(height);
if (_textureBuffer != 0)
delete[] _textureBuffer;
_textureBuffer = new uint8_t[width * height * 3];
memset(_textureBuffer, 0, sizeof(uint8_t) * width * height * 3);
glBindTexture(GL_TEXTURE_2D, _textureID);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
// Set texture coordinates [0, 1] and vertexes position
{
_textureCoords[0] = (float) _width / width;
_textureCoords[1] = (float) _height / height;
_textureCoords[2] = (float) _width / width;
_textureCoords[3] = 0.0;
_textureCoords[4] = 0.0;
_textureCoords[5] = 0.0;
_textureCoords[6] = 0.0;
_textureCoords[7] = (float) _height / height;
_vertexes[0] = _width;
_vertexes[1] = _height;
_vertexes[2] = _width;
_vertexes[3] = 0.0;
_vertexes[4] = 0.0;
_vertexes[5] = 0.0;
_vertexes[6] = 0.0;
_vertexes[7] = _height;
}
// Texture rendering
// Render prepared background texture
void SdlNuitrackRenderHandler::renderTexture()
{
glClearColor(1, 1, 1, 1);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_TEXTURE_2D);
glColor4f(1, 1, 1, 1);
glBindTexture(GL_TEXTURE_2D, _textureID);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, _width, _height, GL_RGB, GL_UNSIGNED_BYTE, _textureBuffer);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glVertexPointer(2, GL_FLOAT, 0, _vertexes);
glTexCoordPointer(2, GL_FLOAT, 0, _textureCoords);
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(GL_TEXTURE_2D);
}
【问题讨论】:
-
您最初是如何想到该代码的?我看到了很多问题,它真的不适合stackoverflow的答案。
-
此代码部分(没有 SDL,但 glut)由 NuiTrack wiki 提供:download.3divi.com/Nuitrack/doc/…
-
该 wiki 代码已经有一些奇怪的结构,并且它使用的是过时的 OpenGL,该 OpenGL 自 十年 以来已被弃用。所以我不会从那开始。然而,OpenGL 是一个复杂的,并且(从这个角度来看)相当低级的渲染 API。在您真正理解问题的解决方案之前,您需要学习很多东西 - 这是 StackOverflow 上无法提供的。
-
我会管理的,谢谢。
-
你说 4k 显示器是纵向模式?这有点不合常规。您还说您稍后将在其上显示 1920x1080 的内容。如果它处于纵向模式,当您切换到高清源时,您将使用屏幕的一小部分。这就像在手机上以纵向模式在手机上观看高清电影一样。您将有一个小矩形,上面和下面都被巨大的黑条包围。这是意图还是我误解了?
标签: c++ opengl sdl kinect sdl-2