mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-11 13:48:30 +09:00
[Feat] (MG_State/Texture): implement GL_TEXTURE_COMPARE_MODE
This commit is contained in:
@@ -70,8 +70,44 @@ namespace MG_GL::GL {
|
|||||||
return components * typeSize;
|
return components * typeSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
// return value: mipmap type or not
|
Diligent::FILTER_TYPE ConvertCompareFilter(Diligent::FILTER_TYPE& filter, bool compare) {
|
||||||
bool FillFilterTypeFromGLEnum(GLenum pname, GLenum param, Diligent::FILTER_TYPE& filter, Diligent::FILTER_TYPE& mipFilter) {
|
if (compare) {
|
||||||
|
switch (filter) {
|
||||||
|
case Diligent::FILTER_TYPE_POINT: return Diligent::FILTER_TYPE_COMPARISON_POINT;
|
||||||
|
case Diligent::FILTER_TYPE_LINEAR: return Diligent::FILTER_TYPE_COMPARISON_LINEAR;
|
||||||
|
case Diligent::FILTER_TYPE_ANISOTROPIC: return Diligent::FILTER_TYPE_COMPARISON_ANISOTROPIC;
|
||||||
|
default: return filter;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
switch (filter) {
|
||||||
|
case Diligent::FILTER_TYPE_COMPARISON_POINT: return Diligent::FILTER_TYPE_POINT;
|
||||||
|
case Diligent::FILTER_TYPE_COMPARISON_LINEAR: return Diligent::FILTER_TYPE_LINEAR;
|
||||||
|
case Diligent::FILTER_TYPE_COMPARISON_ANISOTROPIC: return Diligent::FILTER_TYPE_ANISOTROPIC;
|
||||||
|
default: return filter;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IsCompareFilter(Diligent::FILTER_TYPE filter) {
|
||||||
|
switch (filter) {
|
||||||
|
case Diligent::FILTER_TYPE_COMPARISON_POINT: return true;
|
||||||
|
case Diligent::FILTER_TYPE_COMPARISON_LINEAR: return true;
|
||||||
|
case Diligent::FILTER_TYPE_COMPARISON_ANISOTROPIC: return true;
|
||||||
|
default: return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void FillFilterTypeFromGLEnum(GLenum pname, GLenum param, Diligent::FILTER_TYPE& filter, Diligent::FILTER_TYPE& mipFilter) {
|
||||||
|
if (pname == GL_TEXTURE_COMPARE_MODE) {
|
||||||
|
bool compare = (param == GL_COMPARE_REF_TO_TEXTURE);
|
||||||
|
filter = ConvertCompareFilter(filter, compare);
|
||||||
|
mipFilter = ConvertCompareFilter(mipFilter, compare);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool filterIsCompare = IsCompareFilter(filter);
|
||||||
|
bool mipFilterIsCompare = IsCompareFilter(filter);
|
||||||
|
|
||||||
switch (param) {
|
switch (param) {
|
||||||
case GL_NEAREST:
|
case GL_NEAREST:
|
||||||
filter = Diligent::FILTER_TYPE_POINT;
|
filter = Diligent::FILTER_TYPE_POINT;
|
||||||
@@ -86,23 +122,25 @@ namespace MG_GL::GL {
|
|||||||
case GL_NEAREST_MIPMAP_NEAREST:
|
case GL_NEAREST_MIPMAP_NEAREST:
|
||||||
filter = Diligent::FILTER_TYPE_POINT;
|
filter = Diligent::FILTER_TYPE_POINT;
|
||||||
mipFilter = Diligent::FILTER_TYPE_POINT;
|
mipFilter = Diligent::FILTER_TYPE_POINT;
|
||||||
return true;
|
break;
|
||||||
case GL_LINEAR_MIPMAP_NEAREST:
|
case GL_LINEAR_MIPMAP_NEAREST:
|
||||||
filter = Diligent::FILTER_TYPE_LINEAR;
|
filter = Diligent::FILTER_TYPE_LINEAR;
|
||||||
mipFilter = Diligent::FILTER_TYPE_POINT;
|
mipFilter = Diligent::FILTER_TYPE_POINT;
|
||||||
return true;
|
break;
|
||||||
case GL_NEAREST_MIPMAP_LINEAR:
|
case GL_NEAREST_MIPMAP_LINEAR:
|
||||||
filter = Diligent::FILTER_TYPE_POINT;
|
filter = Diligent::FILTER_TYPE_POINT;
|
||||||
mipFilter = Diligent::FILTER_TYPE_LINEAR;
|
mipFilter = Diligent::FILTER_TYPE_LINEAR;
|
||||||
return true;
|
break;
|
||||||
case GL_LINEAR_MIPMAP_LINEAR:
|
case GL_LINEAR_MIPMAP_LINEAR:
|
||||||
filter = Diligent::FILTER_TYPE_LINEAR;
|
filter = Diligent::FILTER_TYPE_LINEAR;
|
||||||
mipFilter = Diligent::FILTER_TYPE_LINEAR;
|
mipFilter = Diligent::FILTER_TYPE_LINEAR;
|
||||||
return true;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return false;
|
|
||||||
|
filter = ConvertCompareFilter(filter, filterIsCompare);
|
||||||
|
mipFilter = ConvertCompareFilter(mipFilter, mipFilterIsCompare);
|
||||||
}
|
}
|
||||||
|
|
||||||
Diligent::COMPARISON_FUNCTION ConvertComparsionFunc(GLint param) {
|
Diligent::COMPARISON_FUNCTION ConvertComparsionFunc(GLint param) {
|
||||||
@@ -441,6 +479,9 @@ namespace MG_GL::GL {
|
|||||||
case GL_TEXTURE_COMPARE_FUNC:
|
case GL_TEXTURE_COMPARE_FUNC:
|
||||||
SamDesc.ComparisonFunc = ConvertComparsionFunc(param);
|
SamDesc.ComparisonFunc = ConvertComparsionFunc(param);
|
||||||
break;
|
break;
|
||||||
|
case GL_TEXTURE_COMPARE_MODE:
|
||||||
|
FillFilterTypeFromGLEnum(pname, param, SamDesc.MinFilter, SamDesc.MipFilter);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
MG_Util::Debug::LogE("%s: not handled pname: %s", __func__, MG_Util::Debug::GLEnumToString(pname));
|
MG_Util::Debug::LogE("%s: not handled pname: %s", __func__, MG_Util::Debug::GLEnumToString(pname));
|
||||||
}
|
}
|
||||||
@@ -517,6 +558,9 @@ namespace MG_GL::GL {
|
|||||||
case GL_TEXTURE_COMPARE_FUNC:
|
case GL_TEXTURE_COMPARE_FUNC:
|
||||||
SamDesc.ComparisonFunc = ConvertComparsionFunc(param);
|
SamDesc.ComparisonFunc = ConvertComparsionFunc(param);
|
||||||
break;
|
break;
|
||||||
|
case GL_TEXTURE_COMPARE_MODE:
|
||||||
|
FillFilterTypeFromGLEnum(pname, param, SamDesc.MinFilter, SamDesc.MipFilter);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
MG_Util::Debug::LogE("%s: not handled pname: %s", __func__, MG_Util::Debug::GLEnumToString(pname));
|
MG_Util::Debug::LogE("%s: not handled pname: %s", __func__, MG_Util::Debug::GLEnumToString(pname));
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user