소스 검색

[rlgl] Added rlLoadTextureCubemapDepth

pull/5628/head
R2turnTrue 1 주 전
부모
커밋
2a49eb757f
1개의 변경된 파일88개의 추가작업 그리고 0개의 파일을 삭제
  1. +88
    -0
      src/rlgl.h

+ 88
- 0
src/rlgl.h 파일 보기

@ -3573,6 +3573,94 @@ unsigned int rlLoadTextureCubemap(const void *data, int size, int format, int mi
return id;
}
// Load depth cubemap (to be attached to fbo)
// WARNING: OpenGL ES 2.0 requires GL_OES_depth_texture and WebGL requires WEBGL_depth_texture extensions
// Stored the following convention: +X, -X, +Y, -Y, +Z, -Z
unsigned int rlLoadTextureCubemapDepth(int width, int height)
{
unsigned int id = 0;
if (!isGpuReady) { TRACELOG(RL_LOG_WARNING, "GL: GPU is not ready to load data, trying to load before InitWindow()?"); return id; }
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
if (!RLGL.ExtSupported.texDepth)
{
TRACELOG(RL_LOG_WARNING, "GL: Depth cubemap textures not supported");
return id;
}
unsigned int glInternalFormat = GL_DEPTH_COMPONENT;
unsigned int glType = GL_FLOAT;
#if defined(GRAPHICS_API_OPENGL_ES2)
// WARNING: WebGL platform requires unsized internal format definition (GL_DEPTH_COMPONENT)
// while other platforms using OpenGL ES 2.0 require/support sized internal formats depending on the GPU capabilities
if (!RLGL.ExtSupported.texDepthWebGL)
{
if (RLGL.ExtSupported.maxDepthBits == 32)
{
glInternalFormat = GL_DEPTH_COMPONENT32_OES;
glType = GL_FLOAT;
}
else if (RLGL.ExtSupported.maxDepthBits == 24)
{
glInternalFormat = GL_DEPTH_COMPONENT24_OES;
glType = GL_UNSIGNED_INT;
}
else
{
glInternalFormat = GL_DEPTH_COMPONENT16;
glType = GL_UNSIGNED_SHORT;
}
}
#endif
#if defined(GRAPHICS_API_OPENGL_ES3)
// NOTE: This sized internal format should also work for WebGL 2.0
// WARNING: Specification only allows GL_DEPTH_COMPONENT32F for GL_FLOAT type
// REF: https://registry.khronos.org/OpenGL-Refpages/es3.0/html/glTexImage2D.xhtml
if (RLGL.ExtSupported.maxDepthBits == 32)
{
glInternalFormat = GL_DEPTH_COMPONENT32F;
glType = GL_FLOAT;
}
else if (RLGL.ExtSupported.maxDepthBits == 24)
{
glInternalFormat = GL_DEPTH_COMPONENT24;
glType = GL_UNSIGNED_INT;
}
else
{
glInternalFormat = GL_DEPTH_COMPONENT16;
glType = GL_UNSIGNED_SHORT;
}
#endif
glGenTextures(1, &id);
glBindTexture(GL_TEXTURE_CUBE_MAP, id);
// Load cubemap faces
for (int i = 0; i < 6; i++)
{
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, width, height, 0, GL_DEPTH_COMPONENT, glType, NULL);
}
// Set cubemap texture sampling parameters
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
#if defined(GRAPHICS_API_OPENGL_33)|| defined(GRAPHICS_API_OPENGL_ES3)
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); // Flag not supported on OpenGL ES 2.0
#endif
glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
#endif
if (id > 0) TRACELOG(RL_LOG_INFO, "TEXTURE: [ID %i] Depth cubemap texture loaded successfully (%ix%i)", id, width, height);
else TRACELOG(RL_LOG_WARNING, "TEXTURE: Failed to load depth cubemap texture");
return id;
}
// Update already loaded texture in GPU with new data
// WARNING: Not possible to know safely if internal texture format is the expected one...
void rlUpdateTexture(unsigned int id, int offsetX, int offsetY, int width, int height, int format, const void *data)

불러오는 중...
취소
저장