Improve rendering with OpenGL 1.1, removing the visible seams at the cost of slight distortions at high zoom levels.
Originally committed to SVN as r3714.
This commit is contained in:
parent
9ff8f42d7f
commit
3d58608230
2 changed files with 30 additions and 11 deletions
|
@ -102,7 +102,8 @@ VideoOutGL::VideoOutGL()
|
||||||
textureList(NULL),
|
textureList(NULL),
|
||||||
textureCount(0),
|
textureCount(0),
|
||||||
textureRows(0),
|
textureRows(0),
|
||||||
textureCols(0)
|
textureCols(0),
|
||||||
|
openGL11(false)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
|
|
||||||
|
@ -129,6 +130,11 @@ void VideoOutGL::InitTextures(int width, int height, GLenum format, int bpp) {
|
||||||
|
|
||||||
// Test for rectangular texture support
|
// Test for rectangular texture support
|
||||||
supportsRectangularTextures = TestTexture(maxTextureSize, maxTextureSize >> 1, internalFormat);
|
supportsRectangularTextures = TestTexture(maxTextureSize, maxTextureSize >> 1, internalFormat);
|
||||||
|
|
||||||
|
// Check OpenGL version
|
||||||
|
if (strncmp((const char *)glGetString(GL_VERSION), "1.1", 3) == 0) {
|
||||||
|
openGL11 = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Clean up old textures
|
// Clean up old textures
|
||||||
|
@ -200,11 +206,10 @@ void VideoOutGL::InitTextures(int width, int height, GLenum format, int bpp) {
|
||||||
if (GLenum err = glGetError()) throw VideoOutOpenGLException(L"glTexParameteri(GL_TEXTURE_MAG_FILTER)", err);
|
if (GLenum err = glGetError()) throw VideoOutOpenGLException(L"glTexParameteri(GL_TEXTURE_MAG_FILTER)", err);
|
||||||
|
|
||||||
// GL_CLAMP_TO_EDGE was added in OpenGL 1.2, and W7's emulation only supports 1.1
|
// GL_CLAMP_TO_EDGE was added in OpenGL 1.2, and W7's emulation only supports 1.1
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
GLint mode = openGL11 ? GL_REPEAT : GL_CLAMP_TO_EDGE;
|
||||||
if (glGetError()) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, mode);
|
||||||
if (GLenum err = glGetError()) throw VideoOutOpenGLException(L"glTexParameteri(GL_TEXTURE_WRAP_S)", err);
|
if (GLenum err = glGetError()) throw VideoOutOpenGLException(L"glTexParameteri(GL_TEXTURE_WRAP_S)", err);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, mode);
|
||||||
if (glGetError()) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
|
||||||
if (GLenum err = glGetError()) throw VideoOutOpenGLException(L"glTexParameteri(GL_TEXTURE_WRAP_T)", err);
|
if (GLenum err = glGetError()) throw VideoOutOpenGLException(L"glTexParameteri(GL_TEXTURE_WRAP_T)", err);
|
||||||
|
|
||||||
destX += ti.destW;
|
destX += ti.destW;
|
||||||
|
@ -249,18 +254,30 @@ void VideoOutGL::DisplayFrame(AegiVideoFrame frame, int sw, int sh) {
|
||||||
if (GLenum err = glGetError()) throw VideoOutOpenGLException(L"glColor4f", err);
|
if (GLenum err = glGetError()) throw VideoOutOpenGLException(L"glColor4f", err);
|
||||||
float top = 0.0f;
|
float top = 0.0f;
|
||||||
float bottom = ti.texH;
|
float bottom = ti.texH;
|
||||||
|
float left = 0.0f;
|
||||||
|
float right = 1.0f;
|
||||||
|
|
||||||
|
// Slightly stretch the texture under opengl 1.1 to make up for the lack of GL_CLAMP_TO_EDGE
|
||||||
|
if (openGL11) {
|
||||||
|
top = 0.01f;
|
||||||
|
bottom -= 0.01f;
|
||||||
|
left = 0.01f;
|
||||||
|
right -= 0.01f;
|
||||||
|
}
|
||||||
if (frame.flipped) {
|
if (frame.flipped) {
|
||||||
top = ti.texH;
|
float t = top;
|
||||||
bottom = 0.0f;
|
top = bottom;
|
||||||
|
bottom = t;
|
||||||
}
|
}
|
||||||
glBegin(GL_QUADS);
|
glBegin(GL_QUADS);
|
||||||
glTexCoord2f(0.0f, top); glVertex2f(destX, destY);
|
glTexCoord2f(left, top); glVertex2f(destX, destY);
|
||||||
glTexCoord2f(ti.texW, top); glVertex2f(destX + destW, destY);
|
glTexCoord2f(right, top); glVertex2f(destX + destW, destY);
|
||||||
glTexCoord2f(ti.texW, bottom); glVertex2f(destX + destW, destY + destH);
|
glTexCoord2f(right, bottom); glVertex2f(destX + destW, destY + destH);
|
||||||
glTexCoord2f(0.0f, bottom); glVertex2f(destX, destY + destH);
|
glTexCoord2f(left, bottom); glVertex2f(destX, destY + destH);
|
||||||
glEnd();
|
glEnd();
|
||||||
if (GLenum err = glGetError()) throw VideoOutOpenGLException(L"GL_QUADS", err);
|
if (GLenum err = glGetError()) throw VideoOutOpenGLException(L"GL_QUADS", err);
|
||||||
}
|
}
|
||||||
|
|
||||||
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
|
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
|
||||||
if (GLenum err = glGetError()) throw VideoOutOpenGLException(L"glPixelStorei(GL_UNPACK_ROW_LENGTH, default)", err);
|
if (GLenum err = glGetError()) throw VideoOutOpenGLException(L"glPixelStorei(GL_UNPACK_ROW_LENGTH, default)", err);
|
||||||
|
|
||||||
|
|
|
@ -68,6 +68,8 @@ private:
|
||||||
/// The number of columns of textures
|
/// The number of columns of textures
|
||||||
int textureCols;
|
int textureCols;
|
||||||
|
|
||||||
|
bool openGL11;
|
||||||
|
|
||||||
void InitTextures(int width, int height, GLenum format, int bpp);
|
void InitTextures(int width, int height, GLenum format, int bpp);
|
||||||
|
|
||||||
VideoOutGL(const VideoOutGL &);
|
VideoOutGL(const VideoOutGL &);
|
||||||
|
|
Loading…
Reference in a new issue