forked from mia/Aegisub
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