3 #if defined (__APPLE__)
4 #define GL_SILENCE_DEPRECATION
5 #define GL_COMPRESSED_RGBA_BPTC_UNORM 0x8E8C
6 #define GL_INTERNALFORMAT_SUPPORTED 0x826F
7 #include <OpenGL/gl3.h>
8 #include <OpenGL/OpenGL.h>
9 #if !defined(__aarch64__)
10 #include <OpenCL/opencl.h>
11 #include <OpenCL/cl_gl.h>
13 #elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__linux__) || defined(_WIN32) || defined(__HAIKU__)
69 GL3Renderer::GL3Renderer()
82 #if defined (__APPLE__)
107 auto vendor = (
char*)glGetString(GL_VENDOR);
108 return string(vendor);
112 auto renderer = (
char*)glGetString(GL_RENDERER);
113 return string(renderer) +
" [GL3+/CORE]";
125 #if defined (__APPLE__) && !defined(__aarch64__)
126 void GL3Renderer::clErrorCallback(
const char* errorInfo,
const void* privateInfo,
size_t cb,
void* userData) {
127 Console::println(
string(
"GL3Renderer::clErrorCallback(): ") + errorInfo);
137 glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
139 glEnable(GL_DEPTH_TEST);
140 glEnable(GL_CULL_FACE);
141 glDepthFunc(GL_LEQUAL);
142 glBlendEquation(GL_FUNC_ADD);
144 #if !defined (__APPLE__) && !defined(__HAIKU__)
146 glEnable(GL_POINT_SPRITE);
148 glEnable(GL_PROGRAM_POINT_SIZE);
154 #if defined (__APPLE__) && !defined(__aarch64__)
157 auto skinningKernelProgramSource = FileSystem::getInstance()->getContentAsString(
"shader/gl3/skinning",
"skinning.cl");
158 auto skinningKernelProgramSourceSize = skinningKernelProgramSource.size();
159 array<const char*, 1> skinningKernelProgramSourceArray = { skinningKernelProgramSource.data() };
163 cl_device_id clDeviceId = 0;
164 auto clCurrentContext = CGLGetCurrentContext();
165 auto clShareGroup = CGLGetShareGroup(clCurrentContext);
166 gcl_gl_set_sharegroup(clShareGroup);
167 auto clDispatchQueue = gcl_create_dispatch_queue(CL_DEVICE_TYPE_GPU,
nullptr);
168 clDeviceId = gcl_get_device_id_with_dispatch_queue(clDispatchQueue);
172 cl_char clDeviceVendorName[1024] = {0};
173 cl_char clDeviceDeviceName[1024] = {0};
174 clError = clGetDeviceInfo(clDeviceId, CL_DEVICE_VENDOR,
sizeof(clDeviceVendorName) - 1, clDeviceVendorName, &clSize);
175 clError|= clGetDeviceInfo(clDeviceId, CL_DEVICE_NAME,
sizeof(clDeviceDeviceName) - 1, clDeviceDeviceName, &clSize);
176 Console::println(
string(
"GL3Renderer::initialize(): Using OpenCL CL device: ") + (
char*)clDeviceVendorName +
": " + (
char*)clDeviceDeviceName);
179 cl_context_properties properties[] = {
180 CL_CONTEXT_PROPERTY_USE_CGL_SHAREGROUP_APPLE,
181 (cl_context_properties)clShareGroup,
184 clContext = clCreateContext(properties, 1, &clDeviceId, clErrorCallback,
nullptr, &clError);
185 clCommandQueue = clCreateCommandQueue(clContext, clDeviceId, 0, &clError);
186 clSkinningKernelProgram = clCreateProgramWithSource(clContext, 1, skinningKernelProgramSourceArray.data(), &skinningKernelProgramSourceSize, &clError);
187 clError = clBuildProgram(clSkinningKernelProgram, 1, &clDeviceId,
nullptr,
nullptr,
nullptr);
188 auto clBuildInfo = clGetProgramBuildInfo(clSkinningKernelProgram, clDeviceId, CL_PROGRAM_BUILD_STATUS, 0,
nullptr, &clSize);
189 clSkinningKernel = clCreateKernel(clSkinningKernelProgram,
"computeSkinning", &clError);
192 int glMaxColorAttachments = 0;
193 glGetIntegerv(GL_MAX_COLOR_ATTACHMENTS, &glMaxColorAttachments);
194 int glMaxDrawBuffers = 0;
195 glGetIntegerv(GL_MAX_DRAW_BUFFERS, &glMaxDrawBuffers);
198 #if !defined (__APPLE__) && !defined(__HAIKU__)
200 int textureCompressionParam = 0;
201 glGetInternalformativ(
203 GL_COMPRESSED_RGBA_BPTC_UNORM,
204 GL_INTERNALFORMAT_SUPPORTED,
206 &textureCompressionParam
213 for (
auto i = 0; i < rendererContext.lights.size(); i++) {
214 rendererContext.lights[i].spotCosCutoff =
static_cast<float>(Math::cos(Math::PI / 180.0f * 180.0f));
216 rendererContext.textureMatrix.identity();
262 #if defined(__HAIKU__)
268 glGetIntegerv(GL_MAJOR_VERSION, &glMajorVersion);
269 glGetIntegerv(GL_MINOR_VERSION, &glMinorVersion);
270 return (glMajorVersion == 4 && glMinorVersion >= 3) || glMajorVersion > 4;
275 #if defined (__APPLE__) && !defined(__aarch64__)
295 int32_t
GL3Renderer::loadShader(int32_t type,
const string& pathName,
const string& fileName,
const string& definitions,
const string& functions)
298 int32_t shaderId = glCreateShader(type);
300 if (shaderId == 0)
return 0;
303 auto shaderSource = StringTools::replace(
304 StringTools::replace(
305 FileSystem::getInstance()->getContentAsString(pathName, fileName),
312 auto shaderSourceNullTerminated = shaderSource +
"\0";
314 array<const char*, 1> shaderSourceNullTerminatedArray = { shaderSourceNullTerminated.data() };
315 glShaderSource(shaderId, 1, shaderSourceNullTerminatedArray.data(),
nullptr);
317 glCompileShader(shaderId);
319 int32_t compileStatus;
320 glGetShaderiv(shaderId, GL_COMPILE_STATUS, &compileStatus);
321 if (compileStatus == 0) {
323 int32_t infoLogLength;
324 glGetShaderiv(shaderId, GL_INFO_LOG_LENGTH, &infoLogLength);
325 string infoLog(infoLogLength,
static_cast<char>(0));
326 glGetShaderInfoLog(shaderId, infoLogLength, &infoLogLength, infoLog.data());
330 string(
"GL3Renderer::loadShader") +
332 to_string(shaderId) +
337 string(
": failed: ") +
341 Console::println(shaderSource);
343 glDeleteShader(shaderId);
353 glUseProgram(programId);
358 return glCreateProgram();
363 glAttachShader(programId, shaderId);
368 glLinkProgram(programId);
371 glGetProgramiv(programId, GL_LINK_STATUS, &linkStatus);
372 if (linkStatus == 0) {
374 int32_t infoLogLength;
375 glGetProgramiv(programId, GL_INFO_LOG_LENGTH, &infoLogLength);
376 string infoLog(infoLogLength,
static_cast<char>(0));
377 glGetProgramInfoLog(programId, infoLogLength, &infoLogLength, infoLog.data());
381 string(
"GL3Renderer::linkProgram") +
383 to_string(programId) +
397 return glGetUniformLocation(programId, name.c_str());
402 #if defined (__APPLE__) && !defined(__aarch64__)
404 clSkinningParameters.vertexCount = value;
407 clSkinningParameters.matrixCount = value;
410 clSkinningParameters.instanceCount = value;
412 glUniform1i(uniformId, value);
415 glUniform1i(uniformId, value);
421 glUniform1f(uniformId, value);
426 glUniformMatrix3fv(uniformId, 1,
false, data.data());
431 glUniformMatrix4fv(uniformId, 1,
false, data.data());
436 glUniformMatrix4fv(uniformId, count,
false, (
float*)data->
getBuffer());
441 glUniform4fv(uniformId, 1, data.data());
446 glUniform3fv(uniformId, 1, data.data());
451 glUniform2fv(uniformId, 1, data.data());
456 glBindAttribLocation(programId, location, (name).c_str());
472 glClearColor(red, green, blue, alpha);
477 glEnable(GL_CULL_FACE);
482 glDisable(GL_CULL_FACE);
487 glFrontFace(frontFace);
492 glCullFace(cullFace);
497 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
502 glBlendFunc(GL_ONE, GL_ONE);
523 glDisable(GL_DEPTH_TEST);
528 glEnable(GL_DEPTH_TEST);
534 glDepthFunc(depthFunction);
539 glColorMask(red, green, blue, alpha);
552 glGenTextures(1, &textureId);
558 uint32_t depthTextureId;
560 glGenTextures(1, &depthTextureId);
561 glBindTexture(GL_TEXTURE_2D, depthTextureId);
563 glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, width, height, 0, GL_DEPTH_COMPONENT, GL_FLOAT,
nullptr);
565 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
566 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
567 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
568 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
570 glBindTexture(GL_TEXTURE_2D,
ID_NONE);
571 return depthTextureId;
576 uint32_t colorBufferTextureId;
578 glGenTextures(1, &colorBufferTextureId);
579 glBindTexture(GL_TEXTURE_2D, colorBufferTextureId);
581 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE,
nullptr);
583 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
584 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
585 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
586 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
588 glBindTexture(GL_TEXTURE_2D,
ID_NONE);
589 return colorBufferTextureId;
593 uint32_t gBufferGeometryTextureId;
594 glGenTextures(1, &gBufferGeometryTextureId);
595 glBindTexture(GL_TEXTURE_2D, gBufferGeometryTextureId);
596 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, width, height, 0, GL_RGBA, GL_FLOAT,
nullptr);
597 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
598 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
599 glBindTexture(GL_TEXTURE_2D,
ID_NONE);
600 return gBufferGeometryTextureId;
604 uint32_t gBufferColorTextureId;
605 glGenTextures(1, &gBufferColorTextureId);
606 glBindTexture(GL_TEXTURE_2D, gBufferColorTextureId);
607 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE,
nullptr);
608 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
609 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
610 glBindTexture(GL_TEXTURE_2D,
ID_NONE);
611 return gBufferColorTextureId;
621 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
622 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, mipLevels - 1);
626 glCompressedTexImage2D(
629 GL_COMPRESSED_RGBA_BPTC_UNORM,
633 textureTextureData.getCapacity(),
634 textureTextureData.getBuffer()
642 for (
auto& textureMipMap: textureMipMaps) {
643 glCompressedTexImage2D(
646 GL_COMPRESSED_RGBA_BPTC_UNORM,
648 textureMipMap.height,
650 textureMipMap.textureData.getCapacity(),
651 textureMipMap.textureData.getBuffer()
668 textureTextureData.getBuffer()
676 glGetFloatv(GL_MAX_TEXTURE_LOD_BIAS, &maxLodBias);
677 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_LOD_BIAS, -Math::clamp(
static_cast<float>(texture->
getAtlasSize()) * 0.125f, 0.0f, maxLodBias));
679 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, texture->
getMipLevels() - 1);
680 glGenerateMipmap(GL_TEXTURE_2D);
683 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
684 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
687 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, texture->
getMipLevels() - 1);
688 glGenerateMipmap(GL_TEXTURE_2D);
691 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
692 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
694 float color[4] = {0.0f, 0.0f, 0.0f, 0.0f};
702 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
break;
704 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
break;
706 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, texture->
isUseMipMap() ==
true?GL_NEAREST_MIPMAP_NEAREST:GL_NEAREST);
break;
708 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, texture->
isUseMipMap() ==
true?GL_LINEAR_MIPMAP_NEAREST:GL_NEAREST);
break;
710 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, texture->
isUseMipMap() ==
true?GL_NEAREST_MIPMAP_LINEAR:GL_LINEAR);
break;
712 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, texture->
isUseMipMap() ==
true?GL_LINEAR_MIPMAP_LINEAR:GL_LINEAR);
break;
716 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
break;
718 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
break;
720 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, texture->
isUseMipMap() ==
true?GL_NEAREST_MIPMAP_NEAREST:GL_NEAREST);
break;
722 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, texture->
isUseMipMap() ==
true?GL_LINEAR_MIPMAP_NEAREST:GL_NEAREST);
break;
724 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, texture->
isUseMipMap() ==
true?GL_NEAREST_MIPMAP_LINEAR:GL_LINEAR);
break;
726 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, texture->
isUseMipMap() ==
true?GL_LINEAR_MIPMAP_LINEAR:GL_LINEAR);
break;
736 glCompressedTexImage2D(
737 GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
739 GL_COMPRESSED_RGBA_BPTC_UNORM,
743 textureTextureData.getCapacity(),
744 textureTextureData.getBuffer()
751 GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
759 textureTextureData.getBuffer()
766 glCompressedTexImage2D(
767 GL_TEXTURE_CUBE_MAP_POSITIVE_X,
769 GL_COMPRESSED_RGBA_BPTC_UNORM,
773 textureTextureData.getCapacity(),
774 textureTextureData.getBuffer()
781 GL_TEXTURE_CUBE_MAP_POSITIVE_X,
789 textureTextureData.getBuffer()
796 glCompressedTexImage2D(
797 GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
799 GL_COMPRESSED_RGBA_BPTC_UNORM,
803 textureTextureData.getCapacity(),
804 textureTextureData.getBuffer()
811 GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
819 textureTextureData.getBuffer()
826 glCompressedTexImage2D(
827 GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
829 GL_COMPRESSED_RGBA_BPTC_UNORM,
833 textureTextureData.getCapacity(),
834 textureTextureData.getBuffer()
841 GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
849 textureTextureData.getBuffer()
856 glCompressedTexImage2D(
857 GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
859 GL_COMPRESSED_RGBA_BPTC_UNORM,
863 textureTextureData.getCapacity(),
864 textureTextureData.getBuffer()
871 GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
879 textureTextureData.getBuffer()
886 glCompressedTexImage2D(
887 GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
889 GL_COMPRESSED_RGBA_BPTC_UNORM,
893 textureTextureData.getCapacity(),
894 textureTextureData.getBuffer()
901 GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
909 textureTextureData.getBuffer()
912 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
913 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
914 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
915 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
916 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
923 glGenTextures(1, &textureId);
924 glBindTexture(GL_TEXTURE_CUBE_MAP, textureId);
925 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
926 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
927 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
928 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
929 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
931 GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
942 GL_TEXTURE_CUBE_MAP_POSITIVE_X,
953 GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
964 GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
975 GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
986 GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
996 glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
1002 glBindTexture(GL_TEXTURE_2D, textureId);
1003 glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, width, height, 0, GL_DEPTH_COMPONENT, GL_FLOAT,
nullptr);
1004 glBindTexture(GL_TEXTURE_2D, 0);
1009 glBindTexture(GL_TEXTURE_2D, textureId);
1010 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE,
nullptr);
1011 glBindTexture(GL_TEXTURE_2D, 0);
1015 glBindTexture(GL_TEXTURE_2D, textureId);
1016 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, width, height, 0, GL_RGBA, GL_FLOAT,
nullptr);
1017 glBindTexture(GL_TEXTURE_2D, 0);
1021 glBindTexture(GL_TEXTURE_2D, textureId);
1022 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE,
nullptr);
1023 glBindTexture(GL_TEXTURE_2D, 0);
1028 glBindTexture(GL_TEXTURE_2D, textureId);
1033 glBindTexture(GL_TEXTURE_CUBE_MAP, textureId);
1039 glDeleteTextures(1, (
const uint32_t*)&textureId);
1045 uint32_t frameBufferId;
1047 glGenFramebuffers(1, &frameBufferId);
1048 glBindFramebuffer(GL_FRAMEBUFFER, frameBufferId);
1050 if (depthBufferTextureId !=
ID_NONE) {
1051 glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, depthBufferTextureId, 0);
1054 if (colorBufferTextureId !=
ID_NONE) {
1055 glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, colorBufferTextureId, 0);
1056 glDrawBuffer(GL_COLOR_ATTACHMENT0);
1057 glReadBuffer(GL_COLOR_ATTACHMENT0);
1059 if (cubeMapTextureId !=
ID_NONE) {
1060 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, cubeMapTextureIndex, cubeMapTextureId, 0);
1062 glDrawBuffer(GL_NONE);
1063 glReadBuffer(GL_NONE);
1066 int32_t fboStatus = glCheckFramebufferStatus(GL_FRAMEBUFFER);
1067 if (fboStatus != GL_FRAMEBUFFER_COMPLETE) {
1068 Console::println(
string(
"GL_FRAMEBUFFER_COMPLETE_EXT failed, CANNOT use FBO: "+ to_string(fboStatus)));
1071 glBindFramebuffer(GL_FRAMEBUFFER, 0);
1072 return frameBufferId;
1076 int32_t depthBufferTextureId,
1077 int32_t geometryBufferTextureId1,
1078 int32_t geometryBufferTextureId2,
1079 int32_t geometryBufferTextureId3,
1080 int32_t colorBufferTextureId1,
1081 int32_t colorBufferTextureId2,
1082 int32_t colorBufferTextureId3,
1083 int32_t colorBufferTextureId4,
1084 int32_t colorBufferTextureId5
1086 uint32_t frameBufferId;
1088 glGenFramebuffers(1, &frameBufferId);
1089 glBindFramebuffer(GL_FRAMEBUFFER, frameBufferId);
1091 if (depthBufferTextureId !=
ID_NONE) {
1092 glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, depthBufferTextureId, 0);
1094 vector<uint32_t> drawBuffers;
1096 if (geometryBufferTextureId1 !=
ID_NONE) {
1097 glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, geometryBufferTextureId1, 0);
1098 drawBuffers.push_back(GL_COLOR_ATTACHMENT0);
1100 if (geometryBufferTextureId2 !=
ID_NONE) {
1101 glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, geometryBufferTextureId2, 0);
1102 drawBuffers.push_back(GL_COLOR_ATTACHMENT1);
1104 if (geometryBufferTextureId3 !=
ID_NONE) {
1105 glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, geometryBufferTextureId3, 0);
1106 drawBuffers.push_back(GL_COLOR_ATTACHMENT2);
1109 if (colorBufferTextureId1 !=
ID_NONE) {
1110 glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT3, colorBufferTextureId1, 0);
1111 drawBuffers.push_back(GL_COLOR_ATTACHMENT3);
1113 if (colorBufferTextureId2 !=
ID_NONE) {
1114 glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT4, colorBufferTextureId2, 0);
1115 drawBuffers.push_back(GL_COLOR_ATTACHMENT4);
1117 if (colorBufferTextureId3 !=
ID_NONE) {
1118 glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT5, colorBufferTextureId3, 0);
1119 drawBuffers.push_back(GL_COLOR_ATTACHMENT5);
1121 if (colorBufferTextureId4 !=
ID_NONE) {
1122 glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT6, colorBufferTextureId4, 0);
1123 drawBuffers.push_back(GL_COLOR_ATTACHMENT6);
1125 if (colorBufferTextureId5 !=
ID_NONE) {
1126 glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT7, colorBufferTextureId5, 0);
1127 drawBuffers.push_back(GL_COLOR_ATTACHMENT7);
1130 glDrawBuffers(drawBuffers.size(), drawBuffers.data());
1132 int32_t fboStatus = glCheckFramebufferStatus(GL_FRAMEBUFFER);
1133 if (fboStatus != GL_FRAMEBUFFER_COMPLETE) {
1134 Console::println(
string(
"GL_FRAMEBUFFER_COMPLETE_EXT failed, CANNOT use FBO: "+ to_string(fboStatus)));
1137 glBindFramebuffer(GL_FRAMEBUFFER, 0);
1138 return frameBufferId;
1143 glBindFramebuffer(GL_FRAMEBUFFER, frameBufferId);
1148 glDeleteFramebuffers(1, (uint32_t*)&frameBufferId);
1153 vector<int32_t> bufferObjectIds;
1154 bufferObjectIds.resize(buffers);
1155 glGenBuffers(buffers, (uint32_t*)bufferObjectIds.data());
1156 for (
auto bufferObjectId: bufferObjectIds)
vbosUsage[bufferObjectId] = useGPUMemory ==
true?GL_STATIC_DRAW:GL_STREAM_DRAW;
1157 return bufferObjectIds;
1162 glBindBuffer(GL_ARRAY_BUFFER, bufferObjectId);
1164 glBindBuffer(GL_ARRAY_BUFFER,
ID_NONE);
1170 glBindBuffer(GL_ARRAY_BUFFER, bufferObjectId);
1172 glBindBuffer(GL_ARRAY_BUFFER,
ID_NONE);
1178 glBindBuffer(GL_ARRAY_BUFFER, bufferObjectId);
1180 glBindBuffer(GL_ARRAY_BUFFER,
ID_NONE);
1186 Console::println(
string(
"GL3Renderer::uploadIndicesBufferObject()::not implemented yet"));
1191 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bufferObjectId);
1192 glBufferData(GL_ELEMENT_ARRAY_BUFFER, size, data->
getBuffer(),
vbosUsage[bufferObjectId]);
1193 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,
ID_NONE);
1199 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bufferObjectId);
1204 glBindBuffer(GL_ARRAY_BUFFER, bufferObjectId);
1205 glEnableVertexAttribArray(1);
1206 glVertexAttribPointer(1, 1, GL_FLOAT,
false, 0, 0LL);
1211 glBindBuffer(GL_ARRAY_BUFFER, bufferObjectId);
1212 glEnableVertexAttribArray(2);
1213 glVertexAttribPointer(2, 2, GL_FLOAT,
false, 0, 0LL);
1218 glBindBuffer(GL_ARRAY_BUFFER, bufferObjectId);
1219 glEnableVertexAttribArray(0);
1220 glVertexAttribPointer(0, 3, GL_FLOAT,
false, 0, 0LL);
1225 glBindBuffer(GL_ARRAY_BUFFER, bufferObjectId);
1226 glEnableVertexAttribArray(0);
1227 glVertexAttribPointer(0, 2, GL_FLOAT,
false, 0, 0LL);
1232 glBindBuffer(GL_ARRAY_BUFFER, bufferObjectId);
1233 glEnableVertexAttribArray(1);
1234 glVertexAttribPointer(1, 3, GL_FLOAT,
false, 0, 0LL);
1239 glBindBuffer(GL_ARRAY_BUFFER, bufferObjectId);
1240 glEnableVertexAttribArray(3);
1241 glVertexAttribPointer(3, 4, GL_FLOAT,
false, 0, 0LL);
1246 glBindBuffer(GL_ARRAY_BUFFER, bufferObjectId);
1247 glEnableVertexAttribArray(4);
1248 glVertexAttribPointer(4, 3, GL_FLOAT,
false, 0, 0LL);
1253 glBindBuffer(GL_ARRAY_BUFFER, bufferObjectId);
1254 glEnableVertexAttribArray(5);
1255 glVertexAttribPointer(5, 3, GL_FLOAT,
false, 0, 0LL);
1259 glBindBuffer(GL_ARRAY_BUFFER, bufferObjectId);
1260 glEnableVertexAttribArray(6);
1261 glEnableVertexAttribArray(7);
1262 glEnableVertexAttribArray(8);
1263 glEnableVertexAttribArray(9);
1264 glVertexAttribPointer(6, 4, GL_FLOAT,
false, 4 * 4 *
sizeof(
float), (
void*)(0 * 4 *
sizeof(
float)));
1265 glVertexAttribPointer(7, 4, GL_FLOAT,
false, 4 * 4 *
sizeof(
float), (
void*)(1 * 4 *
sizeof(
float)));
1266 glVertexAttribPointer(8, 4, GL_FLOAT,
false, 4 * 4 *
sizeof(
float), (
void*)(2 * 4 *
sizeof(
float)));
1267 glVertexAttribPointer(9, 4, GL_FLOAT,
false, 4 * 4 *
sizeof(
float), (
void*)(3 * 4 *
sizeof(
float)));
1268 glVertexAttribDivisor(6, 1);
1269 glVertexAttribDivisor(7, 1);
1270 glVertexAttribDivisor(8, 1);
1271 glVertexAttribDivisor(9, 1);
1275 glBindBuffer(GL_ARRAY_BUFFER, bufferObjectId);
1276 glEnableVertexAttribArray(10);
1277 glVertexAttribPointer(10, 4, GL_FLOAT,
false, 0, 0LL);
1278 glVertexAttribDivisor(10, divisor);
1282 glBindBuffer(GL_ARRAY_BUFFER, bufferObjectId);
1283 glEnableVertexAttribArray(11);
1284 glVertexAttribPointer(11, 4, GL_FLOAT,
false, 0, 0LL);
1285 glVertexAttribDivisor(11, divisor);
1289 glBindBuffer(GL_ARRAY_BUFFER, bufferObjectId);
1290 glEnableVertexAttribArray(12);
1291 glVertexAttribPointer(12, 3, GL_FLOAT,
false, 0, 0LL);
1295 glBindBuffer(GL_ARRAY_BUFFER, bufferObjectId);
1296 glEnableVertexAttribArray(1);
1297 glVertexAttribIPointer(1, 2, GL_UNSIGNED_SHORT, 0, 0LL);
1301 glBindBuffer(GL_ARRAY_BUFFER, bufferObjectId);
1302 glEnableVertexAttribArray(5);
1303 glVertexAttribPointer(5, 1, GL_FLOAT,
false, 0, 0LL);
1307 glBindBuffer(GL_ARRAY_BUFFER, bufferObjectId);
1308 glEnableVertexAttribArray(6);
1309 glVertexAttribIPointer(6, 2, GL_UNSIGNED_SHORT, 0, 0LL);
1310 glVertexAttribDivisor(6, 0);
1315 #define BUFFER_OFFSET(i) ((void*)(i))
1316 glDrawElementsInstanced(GL_TRIANGLES, triangles * 3, GL_UNSIGNED_INT,
BUFFER_OFFSET(
static_cast<int64_t
>(trianglesOffset) * 3LL * 4LL), instances);
1324 #define BUFFER_OFFSET(i) ((void*)(i))
1325 glDrawElements(GL_TRIANGLES, triangles * 3, GL_UNSIGNED_INT,
BUFFER_OFFSET(
static_cast<int64_t
>(trianglesOffset) * 3LL * 4LL));
1332 glDrawArraysInstanced(GL_TRIANGLES, trianglesOffset * 3, triangles * 3, instances);
1340 glDrawArrays(GL_TRIANGLES, trianglesOffset * 3, triangles * 3);
1348 glDrawArrays(GL_POINTS, pointsOffset, points);
1355 glLineWidth(lineWidth);
1360 glDrawArrays(GL_LINES, pointsOffset, points);
1367 glDisableVertexAttribArray(0);
1368 glDisableVertexAttribArray(1);
1369 glDisableVertexAttribArray(2);
1370 glDisableVertexAttribArray(3);
1371 glDisableVertexAttribArray(4);
1372 glDisableVertexAttribArray(5);
1373 glDisableVertexAttribArray(6);
1374 glDisableVertexAttribArray(7);
1375 glDisableVertexAttribArray(8);
1376 glDisableVertexAttribArray(9);
1377 glDisableVertexAttribArray(10);
1378 glDisableVertexAttribArray(11);
1379 glDisableVertexAttribArray(12);
1380 glBindBuffer(GL_ARRAY_BUFFER,
ID_NONE);
1381 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,
ID_NONE);
1386 for (
auto bufferObjectId: bufferObjectIds)
vbosUsage.erase(bufferObjectId);
1387 glDeleteBuffers(bufferObjectIds.size(), (
const uint32_t*)bufferObjectIds.data());
1399 glActiveTexture(GL_TEXTURE0 + textureUnit);
1405 glReadPixels(x, y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depth);
1411 auto pixelBuffer = ByteBuffer::allocate(width * height * 4);
1412 glPixelStorei(GL_PACK_ALIGNMENT, 1);
1413 glReadPixels(x, y, width, height, GL_RGBA, GL_UNSIGNED_BYTE, pixelBuffer->getBuffer());
1420 glBindTexture(GL_TEXTURE_2D,
ID_NONE);
1421 glBlendEquationSeparate(GL_FUNC_ADD, GL_FUNC_ADD);
1422 glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
1424 glDisable(GL_DEPTH_TEST);
1425 glDisable(GL_CULL_FACE);
1432 glBindTexture(GL_TEXTURE_2D,
ID_NONE);
1433 glDisable(GL_BLEND);
1434 glEnable(GL_DEPTH_TEST);
1435 glEnable(GL_CULL_FACE);
1440 auto error = glGetError();
1441 if (error != GL_NO_ERROR) {
1442 Console::println(
string(
"OpenGL Error: (" + to_string(error) +
") @: " + __FILE__ +
":" + to_string(line)));
1447 #if defined (__APPLE__) && !defined(__aarch64__)
1448 clSkinningParameters.numGroupsX = numGroupsX;
1449 clSkinningParameters.numGroupsY = numGroupsY;
1451 auto& _clSkinningParameters = clSkinningParameters;
1453 array<cl_mem, 8> boundCLMemObjects;
1454 for (
auto i = 0; i < _clSkinningParameters.boundGLBuffers.size(); i++) {
1455 boundCLMemObjects[i] = clCreateFromGLBuffer(clContext, _clSkinningParameters.boundGLBuffersWrite[i] ==
true?CL_MEM_WRITE_ONLY:CL_MEM_READ_ONLY, _clSkinningParameters.boundGLBuffers[i], &clError);
1456 clError = clSetKernelArg(clSkinningKernel, i,
sizeof(cl_mem), &boundCLMemObjects[i]);
1458 clSetKernelArg(clSkinningKernel, 8,
sizeof(cl_int), &_clSkinningParameters.vertexCount);
1459 clSetKernelArg(clSkinningKernel, 9,
sizeof(cl_int), &_clSkinningParameters.matrixCount);
1460 clSetKernelArg(clSkinningKernel, 10,
sizeof(cl_int), &_clSkinningParameters.instanceCount);
1461 size_t local_size[] = {(size_t)16, (
size_t)16};
1462 size_t global_size[] = {(size_t)_clSkinningParameters.numGroupsX * local_size[0], (
size_t)_clSkinningParameters.numGroupsY * local_size[1]};
1463 clEnqueueAcquireGLObjects(clCommandQueue, boundCLMemObjects.size(), boundCLMemObjects.data(), 0,
nullptr,
nullptr);
1464 clEnqueueNDRangeKernel(clCommandQueue, clSkinningKernel, 2,
nullptr, global_size, local_size, 0,
nullptr,
nullptr);
1465 clEnqueueReleaseGLObjects(clCommandQueue, boundCLMemObjects.size(), boundCLMemObjects.data(), 0,
nullptr,
nullptr);
1466 clFinish(clCommandQueue);
1467 clSkinningParameters = CLSkinningParameters();
1469 #elif !defined(__APPLE__)
1470 glDispatchCompute(numGroupsX, numGroupsY, numGroupsZ);
1476 #if defined (__APPLE__)
1480 glMemoryBarrier(GL_ALL_BARRIER_BITS);
1485 #if defined (__APPLE__) && !defined(__aarch64__)
1486 glBindBuffer(GL_ARRAY_BUFFER, bufferObjectId);
1488 glBindBuffer(GL_ARRAY_BUFFER,
ID_NONE);
1490 #elif !defined(__APPLE__)
1491 glBindBuffer(GL_SHADER_STORAGE_BUFFER, bufferObjectId);
1492 glBufferData(GL_SHADER_STORAGE_BUFFER, size, data->
getBuffer(),
vbosUsage[bufferObjectId]);
1493 glBindBuffer(GL_SHADER_STORAGE_BUFFER,
ID_NONE);
1499 #if defined (__APPLE__) && !defined(__aarch64__)
1500 glBindBuffer(GL_ARRAY_BUFFER, bufferObjectId);
1502 glBindBuffer(GL_ARRAY_BUFFER,
ID_NONE);
1504 #elif !defined(__APPLE__)
1505 glBindBuffer(GL_SHADER_STORAGE_BUFFER, bufferObjectId);
1506 glBufferData(GL_SHADER_STORAGE_BUFFER, size, data->
getBuffer(),
vbosUsage[bufferObjectId]);
1507 glBindBuffer(GL_SHADER_STORAGE_BUFFER,
ID_NONE);
1512 #if defined (__APPLE__) && !defined(__aarch64__)
1513 inline void GL3Renderer::clBindGLBuffer(int32_t idx, int32_t bufferObjectId,
bool write) {
1514 clSkinningParameters.boundGLBuffers[idx] = bufferObjectId;
1515 clSkinningParameters.boundGLBuffersWrite[idx] = write;
1520 #if defined (__APPLE__) && !defined(__aarch64__)
1521 clBindGLBuffer(0, bufferObjectId,
false);
1522 #elif !defined(__APPLE__)
1523 glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, bufferObjectId);
1528 #if defined (__APPLE__) && !defined(__aarch64__)
1529 clBindGLBuffer(1, bufferObjectId,
false);
1530 #elif !defined(__APPLE__)
1531 glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, bufferObjectId);
1536 #if defined (__APPLE__) && !defined(__aarch64__)
1537 clBindGLBuffer(2, bufferObjectId,
false);
1538 #elif !defined(__APPLE__)
1539 glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, bufferObjectId);
1544 #if defined (__APPLE__) && !defined(__aarch64__)
1545 clBindGLBuffer(3, bufferObjectId,
false);
1546 #elif !defined(__APPLE__)
1547 glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 3, bufferObjectId);
1552 #if defined (__APPLE__) && !defined(__aarch64__)
1553 clBindGLBuffer(4, bufferObjectId,
false);
1554 #elif !defined(__APPLE__)
1555 glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 4, bufferObjectId);
1560 #if defined (__APPLE__) && !defined(__aarch64__)
1561 clBindGLBuffer(5, bufferObjectId,
true);
1562 #elif !defined(__APPLE__)
1563 glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 5, bufferObjectId);
1568 #if defined (__APPLE__) && !defined(__aarch64__)
1569 clBindGLBuffer(6, bufferObjectId,
true);
1570 #elif !defined(__APPLE__)
1571 glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 6, bufferObjectId);
1576 #if defined (__APPLE__) && !defined(__aarch64__)
1577 clBindGLBuffer(7, bufferObjectId,
false);
1578 #elif !defined(__APPLE__)
1579 glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 7, bufferObjectId);
TextureFilter getMinFilter() const
const vector< MipMapTexture > & getMipMapTextures(bool bc7Encoded)
Get mip map textures.
@ CLAMPMODE_TRANSPARENTPIXEL
ByteBuffer getRGBTextureData()
uint8_t getRGBDepthBitsPerPixel() const
ByteBuffer getBC7TextureData()
uint16_t getTextureHeight() const
TextureFilter getMagFilter() const
uint16_t getTextureWidth() const
ClampMode getClampMode() const
@ TEXTUREFILTER_LINEAR_MIPMAP_LINEAR
@ TEXTUREFILTER_LINEAR_MIPMAP_NEAREST
@ TEXTUREFILTER_NEAREST_MIPMAP_NEAREST
@ TEXTUREFILTER_NEAREST_MIPMAP_LINEAR
uint16_t getAtlasSize() const
bool isUseCompression() const
PNG texture writer class.
void setClearColor(float red, float green, float blue, float alpha) override
Set up clear color.
void enableDepthBufferWriting() override
Enable depth buffer writing.
const string getShaderVersion() override
void bindSpriteSheetDimensionBufferObject(int contextIdx, int32_t bufferObjectId) override
Bind sprite sheet dimension buffer object.
void bindTexture(int contextIdx, int32_t textureId) override
Binds a texture with given id or unbinds when using ID_NONE.
void clear(int32_t mask) override
Clear render buffer with given mask.
void bindTangentsBufferObject(int contextIdx, int32_t bufferObjectId) override
Bind tangents buffer object.
void disposeBufferObjects(vector< int32_t > &bufferObjectIds) override
Disposes a frame buffer object.
int32_t getTextureUnit(int contextIdx) override
Get texture unit.
void setProgramUniformFloatMatrix3x3(int contextIdx, int32_t uniformId, const array< float, 9 > &data) override
Set up a float matrix 3x3 uniform value.
void doneGuiMode() override
Set up renderer for 3d rendering.
void setColorMask(bool red, bool green, bool blue, bool alpha) override
Set up GL rendering colormask.
void bindTextureCoordinatesBufferObject(int contextIdx, int32_t bufferObjectId) override
Bind texture coordinates buffer object.
void bindSkinningVertexJointWeightsBufferObject(int contextIdx, int32_t bufferObjectId) override
Bind skinning vertex joint weights buffer object.
void dispatchCompute(int contextIdx, int32_t numGroupsX, int32_t numGroupsY, int32_t numGroupsZ) override
Dispatch compute.
bool isGLCLAvailable() override
void attachShaderToProgram(int32_t programId, int32_t shaderId) override
Attaches a shader to a program.
void setFrontFace(int contextIdx, int32_t frontFace) override
Set up clock wise or counter clock wise faces as front face.
void setTextureUnit(int contextIdx, int32_t textureUnit) override
Sets up texture unit.
void drawLinesFromBufferObjects(int contextIdx, int32_t points, int32_t pointsOffset) override
Draw lines from buffer objects.
void disableBlending() override
Disables blending.
void setProgramAttributeLocation(int32_t programId, int32_t location, const string &name) override
Bind attribute to a input location.
void setViewPort(int32_t width, int32_t height) override
Set up viewport parameter.
bool isSupportingMultithreadedRendering() override
int32_t getTextureUnits() override
void bindSkinningVerticesResultBufferObject(int contextIdx, int32_t bufferObjectId) override
Bind skinning vertices result buffer object.
void setProgramUniformFloat(int contextIdx, int32_t uniformId, float value) override
Set up a float uniform value.
const string getRenderer() override
const Renderer_Statistics getStatistics() override
void initialize() override
Initialize renderer.
void setVSync(bool vSync) override
Enable/Disable v-sync.
int32_t createGBufferColorTexture(int32_t width, int32_t height) override
Creates a geometry buffer color RGBA texture.
void setProgramUniformFloatVec3(int contextIdx, int32_t uniformId, const array< float, 3 > &data) override
Set up a float vec3 uniform value.
bool isSupportingIntegerProgramAttributes() override
void bindEffectColorAddsBufferObject(int contextIdx, int32_t bufferObjectId, int32_t divisor) override
Bind effect color adds buffer object.
void disposeFrameBufferObject(int32_t frameBufferId) override
Disposes a frame buffer object.
const string getVendor() override
void uploadBufferObject(int contextIdx, int32_t bufferObjectId, int32_t size, FloatBuffer *data) override
Uploads buffer data to buffer object.
bool textureCompressionAvailable
void memoryBarrier() override
Memory barrier.
void setProgramUniformInteger(int contextIdx, int32_t uniformId, int32_t value) override
Set up a integer uniform value.
int32_t getProgramUniformLocation(int32_t programId, const string &name) override
Returns location of given uniform variable.
void disableDepthBufferWriting() override
Disable depth buffer writing.
void bindSkinningVertexJointIdxsBufferObject(int contextIdx, int32_t bufferObjectId) override
Bind skinning vertex joint indices buffer object.
void bindNormalsBufferObject(int contextIdx, int32_t bufferObjectId) override
Bind normals buffer object.
void drawPointsFromBufferObjects(int contextIdx, int32_t points, int32_t pointsOffset) override
Draw points from buffer objects.
void drawInstancedTrianglesFromBufferObjects(int contextIdx, int32_t triangles, int32_t trianglesOffset, int32_t instances) override
Draw instanced triangles from buffer objects.
void disposeTexture(int32_t textureId) override
Dispose a texture.
int32_t createColorBufferTexture(int32_t width, int32_t height, int32_t cubeMapTextureId, int32_t cubeMapTextureIndex) override
Creates a color buffer texture.
void disableCulling(int contextIdx) override
Disable culling.
void bindEffectColorMulsBufferObject(int contextIdx, int32_t bufferObjectId, int32_t divisor) override
Bind effect color muls buffer object.
unordered_map< uint32_t, int32_t > vbosUsage
int32_t createCubeMapTexture(int contextIdx, int32_t width, int32_t height) override
Create cube map texture from frame buffers.
int32_t createFramebufferObject(int32_t depthBufferTextureId, int32_t colorBufferTextureId, int32_t cubeMapTextureId=0, int32_t cubeMapTextureIndex=0) override
Creates a frame buffer object with depth texture attached.
int32_t createDepthBufferTexture(int32_t width, int32_t height, int32_t cubeMapTextureId, int32_t cubeMapTextureIndex) override
Creates a depth buffer texture.
void bindCubeMapTexture(int contextIdx, int32_t textureId) override
Binds a cube map texture with given id or unbinds when using ID_NONE.
bool isPBRAvailable() override
void setProgramUniformFloatVec4(int contextIdx, int32_t uniformId, const array< float, 4 > &data) override
Set up a float vec4 uniform value.
void setDepthFunction(int32_t depthFunction) override
Set up depth function.
void uploadCubeMapTexture(int contextIdx, Texture *textureLeft, Texture *textureRight, Texture *textureTop, Texture *textureBottom, Texture *textureFront, Texture *textureBack) override
Uploads cube map texture data to current bound texture.
void bindFrameBuffer(int32_t frameBufferId) override
Enables a framebuffer to be rendered.
int32_t loadShader(int32_t type, const string &pathName, const string &fileName, const string &definitions=string(), const string &functions=string()) override
Loads a shader.
bool isNormalMappingAvailable() override
void resizeDepthBufferTexture(int32_t textureId, int32_t width, int32_t height) override
Resizes a depth texture.
void resizeGBufferGeometryTexture(int32_t textureId, int32_t width, int32_t height) override
Resizes a geometry buffer geometry texture.
void finishFrame() override
Finish frame.
bool isInstancedRenderingAvailable() override
Checks if instanced rendering is available.
void drawTrianglesFromBufferObjects(int contextIdx, int32_t triangles, int32_t trianglesOffset) override
Draw triangles from buffer objects.
bool isSpecularMappingAvailable() override
void initGuiMode() override
Set up renderer for GUI rendering.
void bindSkinningVertexJointsBufferObject(int contextIdx, int32_t bufferObjectId) override
Bind skinning vertex joints buffer object.
void setCullFace(int32_t cullFace) override
Sets up which face will be culled.
void enableBlending() override
Enables blending.
void uploadIndicesBufferObject(int contextIdx, int32_t bufferObjectId, int32_t size, ShortBuffer *data) override
Uploads buffer data to buffer object.
bool linkProgram(int32_t programId) override
Links attached shaders to a program.
void setProgramUniformFloatMatrix4x4(int contextIdx, int32_t uniformId, const array< float, 16 > &data) override
Set up a float matrix 4x4 uniform value.
void enableCulling(int contextIdx) override
Enable culling.
void bindOriginsBufferObject(int contextIdx, int32_t bufferObjectId) override
Bind origins buffer object.
int32_t createProgram(int type) override
Creates a shader program.
void bindIndicesBufferObject(int contextIdx, int32_t bufferObjectId) override
Bind indices buffer object.
bool isComputeShaderAvailable() override
void initializeFrame() override
Pre Frame Initialization.
int32_t createGBufferGeometryTexture(int32_t width, int32_t height) override
Creates a geometry buffer geometry texture.
void uploadSkinningBufferObject(int contextIdx, int32_t bufferObjectId, int32_t size, FloatBuffer *data) override
Upload skinning buffer object.
void enableAdditionBlending() override
Enable blending with c = a + b.
void bindVerticesBufferObject(int contextIdx, int32_t bufferObjectId) override
Bind vertices buffer object.
bool deferredShadingAvailable
void drawInstancedIndexedTrianglesFromBufferObjects(int contextIdx, int32_t triangles, int32_t trianglesOffset, int32_t instances) override
Draw instanced indexed triangles from buffer objects.
void bindVertices2BufferObject(int contextIdx, int32_t bufferObjectId) override
Bind vertices 2 buffer object.
void useProgram(int contextIdx, int32_t programId) override
Use shader program.
void bindColorsBufferObject(int contextIdx, int32_t bufferObjectId) override
Bind colors buffer object.
void bindPointSizesBufferObject(int contextIdx, int32_t bufferObjectId) override
Bind point sizes buffer object.
void bindSkinningVerticesBufferObject(int contextIdx, int32_t bufferObjectId) override
Bind skinning vertices buffer object.
void checkGLError(int line)
Checks if GL error did occour.
void bindBitangentsBufferObject(int contextIdx, int32_t bufferObjectId) override
Bind bitangents buffer object.
void bindSkinningNormalsResultBufferObject(int contextIdx, int32_t bufferObjectId) override
Bind skinning normals result buffer object.
void setProgramUniformFloatMatrices4x4(int contextIdx, int32_t uniformId, int32_t count, FloatBuffer *data) override
Set up a float matrices 4x4 uniform values.
void resizeGBufferColorTexture(int32_t textureId, int32_t width, int32_t height) override
Resizes a geometry buffer color RGBA texture.
void bindSkinningMatricesBufferObject(int contextIdx, int32_t bufferObjectId) override
Bind skinning matrices result buffer object.
int32_t createGeometryBufferObject(int32_t depthBufferTextureId, int32_t geometryBufferTextureId1, int32_t geometryBufferTextureId2, int32_t geometryBufferTextureId3, int32_t colorBufferTextureId1, int32_t colorBufferTextureId2, int32_t colorBufferTextureId3, int32_t colorBufferTextureId4, int32_t colorBufferTextureId5) override
Creates a geometry frame buffer object.
vector< int32_t > createBufferObjects(int32_t buffers, bool useGPUMemory, bool shared) override
Generate buffer objects for vertex data and such.
void updateViewPort() override
Update viewport.
void bindModelMatricesBufferObject(int contextIdx, int32_t bufferObjectId) override
Bind model matrices buffer object.
void drawIndexedTrianglesFromBufferObjects(int contextIdx, int32_t triangles, int32_t trianglesOffset) override
Draw indexed triangles from buffer objects.
void disableDepthBufferTest() override
Disable depth buffer test.
void bindSkinningNormalsBufferObject(int contextIdx, int32_t bufferObjectId) override
Bind skinning normal buffer object.
void unbindBufferObjects(int contextIdx) override
Unbind buffer objects.
int32_t createTexture() override
Creates a texture.
float readPixelDepth(int32_t x, int32_t y) override
Reads a pixel depth.
void uploadTexture(int contextIdx, Texture *texture) override
Uploads texture data to current bound texture.
bool isUsingShortIndices() override
void setLineWidth(float lineWidth) override
Set line width.
ByteBuffer * readPixels(int32_t x, int32_t y, int32_t width, int32_t height) override
Read pixels.
void enableDepthBufferTest() override
Enable depth buffer test.
void resizeColorBufferTexture(int32_t textureId, int32_t width, int32_t height) override
Resize color buffer texture.
void bindTextureSpriteIndicesBufferObject(int contextIdx, int32_t bufferObjectId) override
Bind texture and sprite indices buffer object.
bool isTextureCompressionAvailable() override
void setProgramUniformFloatVec2(int contextIdx, int32_t uniformId, const array< float, 2 > &data) override
Set up a float vec2 uniform value.
bool isDeferredShadingAvailable() override
void bindSolidColorsBufferObject(int contextIdx, int32_t bufferObjectId) override
Bind solid colors buffer object.
bool isUsingProgramAttributeLocation() override
int32_t CUBEMAPTEXTUREINDEX_NEGATIVE_Z
int32_t SHADER_FRAGMENT_SHADER
Renderer_Statistics statistics
int32_t SHADER_COMPUTE_SHADER
int32_t SHADER_VERTEX_SHADER
int32_t UNIFORM_CL_SKINNING_MATRIX_COUNT
int32_t CLEAR_COLOR_BUFFER_BIT
int32_t UNIFORM_CL_SKINNING_VERTEX_COUNT
int32_t CUBEMAPTEXTUREINDEX_NEGATIVE_X
int32_t CUBEMAPTEXTUREINDEX_POSITIVE_Y
int32_t UNIFORM_CL_SKINNING_INSTANCE_COUNT
vector< Renderer_Context > rendererContexts
int32_t CUBEMAPTEXTUREINDEX_NEGATIVE_Y
virtual void onBindTexture(int contextIdx, int32_t textureId)=0
On bind texture event.
RendererType rendererType
int32_t DEPTHFUNCTION_ALWAYS
int32_t DEPTHFUNCTION_LESSEQUAL
int32_t DEPTHFUNCTION_GREATEREQUAL
int32_t CUBEMAPTEXTUREINDEX_POSITIVE_Z
int32_t CONTEXTINDEX_DEFAULT
int32_t DEPTHFUNCTION_EQUAL
int32_t FRAMEBUFFER_DEFAULT
int32_t CUBEMAPTEXTUREINDEX_POSITIVE_X
int32_t CLEAR_DEPTH_BUFFER_BIT
Matrix4x4 class representing matrix4x4 mathematical structure and operations for 3d space.
File system singleton class.
const uint8_t * getBuffer() const
Bean holding light properties.
uint32_t disposedTextures
int64_t memoryUsageShared