1
0
mirror of https://github.com/blawar/GLideN64.git synced 2024-07-07 03:13:49 +00:00

Correct texture coordinates for frame buffer textures

This commit is contained in:
Sergey Lipskiy 2014-03-23 18:04:39 +07:00
parent 39801cbb7b
commit eadde5abbc
5 changed files with 42 additions and 25 deletions

View File

@ -527,6 +527,7 @@ void GLSLCombiner::_locateUniforms() {
LocateUniform(uCacheScale[1]);
LocateUniform(uCacheOffset[0]);
LocateUniform(uCacheOffset[1]);
LocateUniform(uCacheFrameBuffer);
}
void GLSLCombiner::_locate_attributes() const {
@ -606,34 +607,30 @@ void GLSLCombiner::UpdateColors(bool _bForce) {
void GLSLCombiner::UpdateTextureInfo(bool _bForce) {
_setIUniform(m_uniforms.uTexturePersp, gDP.otherMode.texturePersp, _bForce);
_setV2Uniform(m_uniforms.uTexScale, gSP.texture.scales, gSP.texture.scalet, _bForce);
if (combiner.usesT0)
{
_setFV2Uniform(m_uniforms.uTexScale, gSP.texture.scales, gSP.texture.scalet, _bForce);
int nFB0 = 0, nFB1 = 0;
if (combiner.usesT0) {
if (gSP.textureTile[0])
{
_setV2Uniform(m_uniforms.uTexOffset[0], gSP.textureTile[0]->fuls, gSP.textureTile[0]->fult, _bForce);
}
if (cache.current[0])
{
_setV2Uniform(m_uniforms.uCacheShiftScale[0], cache.current[0]->shiftScaleS, cache.current[0]->shiftScaleT, _bForce);
_setV2Uniform(m_uniforms.uCacheScale[0], cache.current[0]->scaleS, cache.current[0]->scaleT, _bForce);
_setV2Uniform(m_uniforms.uCacheOffset[0], cache.current[0]->offsetS, cache.current[0]->offsetT, _bForce);
_setFV2Uniform(m_uniforms.uTexOffset[0], gSP.textureTile[0]->fuls, gSP.textureTile[0]->fult, _bForce);
if (cache.current[0]) {
_setFV2Uniform(m_uniforms.uCacheShiftScale[0], cache.current[0]->shiftScaleS, cache.current[0]->shiftScaleT, _bForce);
_setFV2Uniform(m_uniforms.uCacheScale[0], cache.current[0]->scaleS, cache.current[0]->scaleT, _bForce);
_setFV2Uniform(m_uniforms.uCacheOffset[0], cache.current[0]->offsetS, cache.current[0]->offsetT, _bForce);
nFB0 = cache.current[0]->frameBufferTexture;
}
}
if (combiner.usesT1)
{
if (combiner.usesT1) {
if (gSP.textureTile[1])
{
_setV2Uniform(m_uniforms.uTexOffset[1], gSP.textureTile[1]->fuls, gSP.textureTile[1]->fult, _bForce);
}
if (cache.current[1])
{
_setV2Uniform(m_uniforms.uCacheShiftScale[1], cache.current[1]->shiftScaleS, cache.current[1]->shiftScaleT, _bForce);
_setV2Uniform(m_uniforms.uCacheScale[1], cache.current[1]->scaleS, cache.current[1]->scaleT, _bForce);
_setV2Uniform(m_uniforms.uCacheOffset[1], cache.current[1]->offsetS, cache.current[1]->offsetT, _bForce);
_setFV2Uniform(m_uniforms.uTexOffset[1], gSP.textureTile[1]->fuls, gSP.textureTile[1]->fult, _bForce);
if (cache.current[1]) {
_setFV2Uniform(m_uniforms.uCacheShiftScale[1], cache.current[1]->shiftScaleS, cache.current[1]->shiftScaleT, _bForce);
_setFV2Uniform(m_uniforms.uCacheScale[1], cache.current[1]->scaleS, cache.current[1]->scaleT, _bForce);
_setFV2Uniform(m_uniforms.uCacheOffset[1], cache.current[1]->offsetS, cache.current[1]->offsetT, _bForce);
nFB1 = cache.current[1]->frameBufferTexture;
}
}
_setIV2Uniform(m_uniforms.uCacheFrameBuffer, nFB0, nFB1, _bForce);
}
void GLSLCombiner::UpdateFBInfo(bool _bForce) {

View File

@ -17,6 +17,7 @@ private:
struct iUniform {GLint loc; int val;};
struct fUniform {GLint loc; float val;};
struct fv2Uniform {GLint loc; float val[2];};
struct iv2Uniform {GLint loc; int val[2];};
struct fv4Uniform {GLint loc; float val[4];};
struct UniformLocation
@ -34,6 +35,8 @@ private:
fv2Uniform uTexScale, uTexOffset[2], uCacheShiftScale[2],
uCacheScale[2], uCacheOffset[2];
iv2Uniform uCacheFrameBuffer;
};
void _locate_attributes() const;
@ -50,13 +53,20 @@ private:
glUniform1f(_u.loc, _val);
}
}
void _setV2Uniform(fv2Uniform & _u, float _val1, float _val2, bool _force) {
void _setFV2Uniform(fv2Uniform & _u, float _val1, float _val2, bool _force) {
if (_force|| _u.val[0] != _val1 || _u.val[1] != _val2) {
_u.val[0] = _val1;
_u.val[2] = _val2;
glUniform2f(_u.loc, _val1, _val2);
}
}
void _setIV2Uniform(iv2Uniform & _u, int _val1, int _val2, bool _force) {
if (_force|| _u.val[0] != _val1 || _u.val[1] != _val2) {
_u.val[0] = _val1;
_u.val[2] = _val2;
glUniform2i(_u.loc, _val1, _val2);
}
}
void _setV4Uniform(fv4Uniform & _u, float * _pVal, bool _force) {
const size_t szData = sizeof(float)*4;
if (_force|| memcmp(_u.val, _pVal, szData) > 0) {

View File

@ -28,6 +28,7 @@ PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation;
PFNGLUNIFORM1IPROC glUniform1i;
PFNGLUNIFORM1FPROC glUniform1f;
PFNGLUNIFORM2FPROC glUniform2f;
PFNGLUNIFORM2IPROC glUniform2i;
PFNGLUNIFORM4FPROC glUniform4f;
PFNGLUNIFORM4FVPROC glUniform4fv;
PFNGLDETACHSHADERPROC glDetachShader;
@ -125,6 +126,7 @@ void OGL_InitExtensions()
glUniform1i = (PFNGLUNIFORM1IPROC)wglGetProcAddress("glUniform1i");
glUniform1f = (PFNGLUNIFORM1FPROC)wglGetProcAddress("glUniform1f");
glUniform2f = (PFNGLUNIFORM2FPROC)wglGetProcAddress("glUniform2f");
glUniform2i = (PFNGLUNIFORM2IPROC)wglGetProcAddress("glUniform2i");
glUniform4f = (PFNGLUNIFORM4FPROC)wglGetProcAddress("glUniform4f");
glUniform4fv = (PFNGLUNIFORM4FVPROC)wglGetProcAddress("glUniform4fv");
glDetachShader = (PFNGLDETACHSHADERPROC)wglGetProcAddress("glDetachShader");

View File

@ -129,6 +129,7 @@ extern PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation;
extern PFNGLUNIFORM1IPROC glUniform1i;
extern PFNGLUNIFORM1FPROC glUniform1f;
extern PFNGLUNIFORM2FPROC glUniform2f;
extern PFNGLUNIFORM2IPROC glUniform2i;
extern PFNGLUNIFORM4FPROC glUniform4f;
extern PFNGLUNIFORM4FVPROC glUniform4fv;
extern PFNGLDETACHSHADERPROC glDetachShader;

View File

@ -15,7 +15,8 @@ static const char* vertex_shader =
"uniform vec2 uTexOffset[2]; \n"
"uniform vec2 uCacheShiftScale[2]; \n"
"uniform vec2 uCacheScale[2]; \n"
"uniform vec2 uCacheOffset[2]; \n"
"uniform vec2 uCacheOffset[2]; \n"
"uniform ivec2 uCacheFrameBuffer; \n"
" \n"
"varying vec4 vShadeColor; \n"
"varying vec2 vTexCoord0; \n"
@ -31,9 +32,15 @@ static const char* vertex_shader =
" vec2 vTexCoord = aTexCoord0; \n"
" if (aSTScaled == 0.0) vTexCoord *= uTexScale; \n"
" if (uTexturePersp == 0) vTexCoord *= 0.5; \n"
" vTexCoord0 = ((vTexCoord*uCacheShiftScale[0]) + \n"
" vec2 cacheShiftScale = uCacheShiftScale[0]; \n"
" if (uCacheFrameBuffer[0] != 0) \n"
" cacheShiftScale.t = -cacheShiftScale.t; \n"
" vTexCoord0 = ((vTexCoord*cacheShiftScale) + \n"
" (uCacheOffset[0] - uTexOffset[0])) * uCacheScale[0]; \n"
" vTexCoord1 = ((vTexCoord*uCacheShiftScale[1]) + \n"
" cacheShiftScale = uCacheShiftScale[1]; \n"
" if (uCacheFrameBuffer[1] != 0) \n"
" cacheShiftScale.t = -cacheShiftScale.t; \n"
" vTexCoord1 = ((vTexCoord*cacheShiftScale) + \n"
" (uCacheOffset[1] - uTexOffset[1])) * uCacheScale[1]; \n"
" vLodTexCoord = vTexCoord * uCacheShiftScale[0]; \n"
" } else { \n"