void OpenGLShaderPointLight::init(uint32_t bindingPoint, uint32_t lightIndex) { setBlockName("PointLight"); setBindingPoint(bindingPoint); setBlockArrayIndex(lightIndex); addParamName("position"); addParamName("ambient"); addParamName("diffuse"); addParamName("specular"); addParamName("attenuation"); addParamName("cutoff"); }
void OGLShaderObject::_initActiveUniform() noexcept { GLint numUniform = 0; GLint maxUniformLength = 0; GLint numTexUnit = 0; glGetProgramiv(_program, GL_ACTIVE_UNIFORMS, &numUniform); glGetProgramiv(_program, GL_ACTIVE_UNIFORM_MAX_LENGTH, &maxUniformLength); if (numUniform == 0) return; auto nameUniform = std::make_unique<GLchar[]>(maxUniformLength + 1); nameUniform[maxUniformLength] = 0; for (GLint i = 0; i < numUniform; ++i) { GLint size; GLenum type; glGetActiveUniform(_program, (GLuint)i, maxUniformLength, 0, &size, &type, nameUniform.get()); if (std::strstr(nameUniform.get(), ".") != 0 || nameUniform[0] == '_') continue; GLuint location = glGetUniformLocation(_program, nameUniform.get()); if (location == GL_INVALID_INDEX) continue; auto uniform = std::make_shared<ShaderUniform>(); uniform->setName(nameUniform.get()); uniform->setLocation(location); uniform->setBindingProgram(_program); if (type == GL_SAMPLER_2D || type == GL_SAMPLER_3D || type == GL_SAMPLER_2D_SHADOW || type == GL_SAMPLER_2D_ARRAY || type == GL_SAMPLER_CUBE || type == GL_SAMPLER_2D_ARRAY_SHADOW || type == GL_SAMPLER_CUBE_SHADOW) { uniform->setType(SPT_TEXTURE); uniform->setBindingPoint(numTexUnit++); } else { bool isArray = uniform->getName().find("[0]") != std::string::npos; if (type == GL_BOOL) uniform->setType(SPT_BOOL); else if (type == GL_INT) uniform->setType(SPT_INT); else if (type == GL_INT_VEC2) uniform->setType(SPT_INT2); else if (type == GL_FLOAT) { if (isArray) uniform->setType(SPT_FLOAT_ARRAY); else uniform->setType(SPT_FLOAT); } else if (type == GL_FLOAT_VEC2) { if (isArray) uniform->setType(SPT_FLOAT2_ARRAY); else uniform->setType(SPT_FLOAT2); } else if (type == GL_FLOAT_VEC3) { if (isArray) uniform->setType(SPT_FLOAT3_ARRAY); else uniform->setType(SPT_FLOAT3); } else if (type == GL_FLOAT_VEC4) { if (isArray) uniform->setType(SPT_FLOAT4_ARRAY); else uniform->setType(SPT_FLOAT4); } else if (type == GL_FLOAT_MAT3) uniform->setType(SPT_FLOAT3X3); else if (type == GL_FLOAT_MAT4) uniform->setType(SPT_FLOAT4X4); else assert(false); } _activeUniforms.push_back(uniform); } }