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:
parent
39801cbb7b
commit
eadde5abbc
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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");
|
||||
|
|
1
OpenGL.h
1
OpenGL.h
|
@ -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;
|
||||
|
|
13
Shaders.h
13
Shaders.h
|
@ -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"
|
||||
|
|
Loading…
Reference in New Issue
Block a user