mirror of
https://thingvellir.net/git/overte
synced 2025-03-27 23:52:03 +01:00
fixing compilation on macosx
This commit is contained in:
parent
55f797f349
commit
ee5409b0a8
2 changed files with 316 additions and 309 deletions
|
@ -29,13 +29,13 @@ GLBackend::GLShader::~GLShader() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void makeBindings(GLBackend::GLShader* shader) {
|
void makeBindings(GLBackend::GLShader* shader) {
|
||||||
if(!shader || !shader->_program) {
|
if(!shader || !shader->_program) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
GLuint glprogram = shader->_program;
|
GLuint glprogram = shader->_program;
|
||||||
GLint loc = -1;
|
GLint loc = -1;
|
||||||
|
|
||||||
//Check for gpu specific attribute slotBindings
|
//Check for gpu specific attribute slotBindings
|
||||||
loc = glGetAttribLocation(glprogram, "position");
|
loc = glGetAttribLocation(glprogram, "position");
|
||||||
if (loc >= 0) {
|
if (loc >= 0) {
|
||||||
glBindAttribLocation(glprogram, gpu::Stream::POSITION, "position");
|
glBindAttribLocation(glprogram, gpu::Stream::POSITION, "position");
|
||||||
|
@ -74,234 +74,235 @@ void makeBindings(GLBackend::GLShader* shader) {
|
||||||
loc = glGetAttribLocation(glprogram, "clusterWeights");
|
loc = glGetAttribLocation(glprogram, "clusterWeights");
|
||||||
if (loc >= 0) {
|
if (loc >= 0) {
|
||||||
glBindAttribLocation(glprogram, gpu::Stream::SKIN_CLUSTER_WEIGHT, "clusterWeights");
|
glBindAttribLocation(glprogram, gpu::Stream::SKIN_CLUSTER_WEIGHT, "clusterWeights");
|
||||||
}
|
|
||||||
|
|
||||||
// Link again to take into account the assigned attrib location
|
|
||||||
glLinkProgram(glprogram);
|
|
||||||
|
|
||||||
GLint linked = 0;
|
|
||||||
glGetProgramiv(glprogram, GL_LINK_STATUS, &linked);
|
|
||||||
if (!linked) {
|
|
||||||
qDebug() << "GLShader::makeBindings - failed to link after assigning slotBindings?";
|
|
||||||
}
|
|
||||||
|
|
||||||
// now assign the ubo binding, then DON't relink!
|
|
||||||
|
|
||||||
//Check for gpu specific uniform slotBindings
|
|
||||||
loc = glGetUniformBlockIndex(glprogram, "transformObjectBuffer");
|
|
||||||
if (loc >= 0) {
|
|
||||||
glUniformBlockBinding(glprogram, loc, gpu::TRANSFORM_OBJECT_SLOT);
|
|
||||||
shader->_transformObjectSlot = gpu::TRANSFORM_OBJECT_SLOT;
|
|
||||||
}
|
|
||||||
|
|
||||||
loc = glGetUniformBlockIndex(glprogram, "transformCameraBuffer");
|
|
||||||
if (loc >= 0) {
|
|
||||||
glUniformBlockBinding(glprogram, loc, gpu::TRANSFORM_CAMERA_SLOT);
|
|
||||||
shader->_transformCameraSlot = gpu::TRANSFORM_OBJECT_SLOT;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Link again to take into account the assigned attrib location
|
||||||
|
glLinkProgram(glprogram);
|
||||||
|
|
||||||
|
GLint linked = 0;
|
||||||
|
glGetProgramiv(glprogram, GL_LINK_STATUS, &linked);
|
||||||
|
if (!linked) {
|
||||||
|
qDebug() << "GLShader::makeBindings - failed to link after assigning slotBindings?";
|
||||||
|
}
|
||||||
|
|
||||||
|
// now assign the ubo binding, then DON't relink!
|
||||||
|
|
||||||
|
//Check for gpu specific uniform slotBindings
|
||||||
|
#if defined(Q_OS_WIN)
|
||||||
|
loc = glGetUniformBlockIndex(glprogram, "transformObjectBuffer");
|
||||||
|
if (loc >= 0) {
|
||||||
|
glUniformBlockBinding(glprogram, loc, gpu::TRANSFORM_OBJECT_SLOT);
|
||||||
|
shader->_transformObjectSlot = gpu::TRANSFORM_OBJECT_SLOT;
|
||||||
|
}
|
||||||
|
|
||||||
|
loc = glGetUniformBlockIndex(glprogram, "transformCameraBuffer");
|
||||||
|
if (loc >= 0) {
|
||||||
|
glUniformBlockBinding(glprogram, loc, gpu::TRANSFORM_CAMERA_SLOT);
|
||||||
|
shader->_transformCameraSlot = gpu::TRANSFORM_OBJECT_SLOT;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
GLBackend::GLShader* compileShader(const Shader& shader) {
|
GLBackend::GLShader* compileShader(const Shader& shader) {
|
||||||
// Any GLSLprogram ? normally yes...
|
// Any GLSLprogram ? normally yes...
|
||||||
const std::string& shaderSource = shader.getSource().getCode();
|
const std::string& shaderSource = shader.getSource().getCode();
|
||||||
if (shaderSource.empty()) {
|
if (shaderSource.empty()) {
|
||||||
qDebug() << "GLShader::compileShader - no GLSL shader source code ? so failed to create";
|
qDebug() << "GLShader::compileShader - no GLSL shader source code ? so failed to create";
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Shader domain
|
// Shader domain
|
||||||
const GLenum SHADER_DOMAINS[2] = { GL_VERTEX_SHADER, GL_FRAGMENT_SHADER };
|
const GLenum SHADER_DOMAINS[2] = { GL_VERTEX_SHADER, GL_FRAGMENT_SHADER };
|
||||||
GLenum shaderDomain = SHADER_DOMAINS[shader.getType()];
|
GLenum shaderDomain = SHADER_DOMAINS[shader.getType()];
|
||||||
|
|
||||||
// Create the shader object
|
// Create the shader object
|
||||||
GLuint glshader = glCreateShader(shaderDomain);
|
GLuint glshader = glCreateShader(shaderDomain);
|
||||||
if (!glshader) {
|
if (!glshader) {
|
||||||
qDebug() << "GLShader::compileShader - failed to create the gl shader object";
|
qDebug() << "GLShader::compileShader - failed to create the gl shader object";
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Assign the source
|
// Assign the source
|
||||||
const GLchar* srcstr = shaderSource.c_str();
|
const GLchar* srcstr = shaderSource.c_str();
|
||||||
glShaderSource(glshader, 1, &srcstr, NULL);
|
glShaderSource(glshader, 1, &srcstr, NULL);
|
||||||
|
|
||||||
// Compile !
|
// Compile !
|
||||||
glCompileShader(glshader);
|
glCompileShader(glshader);
|
||||||
|
|
||||||
// check if shader compiled
|
// check if shader compiled
|
||||||
GLint compiled = 0;
|
GLint compiled = 0;
|
||||||
glGetShaderiv(glshader, GL_COMPILE_STATUS, &compiled);
|
glGetShaderiv(glshader, GL_COMPILE_STATUS, &compiled);
|
||||||
|
|
||||||
// if compilation fails
|
// if compilation fails
|
||||||
if (!compiled) {
|
if (!compiled) {
|
||||||
// save the source code to a temp file so we can debug easily
|
// save the source code to a temp file so we can debug easily
|
||||||
/* std::ofstream filestream;
|
/* std::ofstream filestream;
|
||||||
filestream.open("debugshader.glsl");
|
filestream.open("debugshader.glsl");
|
||||||
if (filestream.is_open()) {
|
if (filestream.is_open()) {
|
||||||
filestream << shaderSource->source;
|
filestream << shaderSource->source;
|
||||||
filestream.close();
|
filestream.close();
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
GLint infoLength = 0;
|
GLint infoLength = 0;
|
||||||
glGetShaderiv(glshader, GL_INFO_LOG_LENGTH, &infoLength);
|
glGetShaderiv(glshader, GL_INFO_LOG_LENGTH, &infoLength);
|
||||||
|
|
||||||
char* temp = new char[infoLength] ;
|
char* temp = new char[infoLength] ;
|
||||||
glGetShaderInfoLog(glshader, infoLength, NULL, temp);
|
glGetShaderInfoLog(glshader, infoLength, NULL, temp);
|
||||||
|
|
||||||
qDebug() << "GLShader::compileShader - failed to compile the gl shader object:";
|
qDebug() << "GLShader::compileShader - failed to compile the gl shader object:";
|
||||||
qDebug() << temp;
|
qDebug() << temp;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
filestream.open("debugshader.glsl.info.txt");
|
filestream.open("debugshader.glsl.info.txt");
|
||||||
if (filestream.is_open()) {
|
if (filestream.is_open()) {
|
||||||
filestream << std::string(temp);
|
filestream << std::string(temp);
|
||||||
filestream.close();
|
filestream.close();
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
delete[] temp;
|
delete[] temp;
|
||||||
|
|
||||||
glDeleteShader(glshader);
|
glDeleteShader(glshader);
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
GLuint glprogram = 0;
|
GLuint glprogram = 0;
|
||||||
#ifdef SEPARATE_PROGRAM
|
#ifdef SEPARATE_PROGRAM
|
||||||
// so far so good, program is almost done, need to link:
|
// so far so good, program is almost done, need to link:
|
||||||
GLuint glprogram = glCreateProgram();
|
GLuint glprogram = glCreateProgram();
|
||||||
if (!glprogram) {
|
if (!glprogram) {
|
||||||
qDebug() << "GLShader::compileShader - failed to create the gl shader & gl program object";
|
qDebug() << "GLShader::compileShader - failed to create the gl shader & gl program object";
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
glProgramParameteri(glprogram, GL_PROGRAM_SEPARABLE, GL_TRUE);
|
glProgramParameteri(glprogram, GL_PROGRAM_SEPARABLE, GL_TRUE);
|
||||||
glAttachShader(glprogram, glshader);
|
glAttachShader(glprogram, glshader);
|
||||||
glLinkProgram(glprogram);
|
glLinkProgram(glprogram);
|
||||||
|
|
||||||
GLint linked = 0;
|
GLint linked = 0;
|
||||||
glGetProgramiv(glprogram, GL_LINK_STATUS, &linked);
|
glGetProgramiv(glprogram, GL_LINK_STATUS, &linked);
|
||||||
|
|
||||||
if (!linked) {
|
if (!linked) {
|
||||||
/*
|
/*
|
||||||
// save the source code to a temp file so we can debug easily
|
// save the source code to a temp file so we can debug easily
|
||||||
std::ofstream filestream;
|
std::ofstream filestream;
|
||||||
filestream.open("debugshader.glsl");
|
filestream.open("debugshader.glsl");
|
||||||
if (filestream.is_open()) {
|
if (filestream.is_open()) {
|
||||||
filestream << shaderSource->source;
|
filestream << shaderSource->source;
|
||||||
filestream.close();
|
filestream.close();
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
GLint infoLength = 0;
|
GLint infoLength = 0;
|
||||||
glGetProgramiv(glprogram, GL_INFO_LOG_LENGTH, &infoLength);
|
glGetProgramiv(glprogram, GL_INFO_LOG_LENGTH, &infoLength);
|
||||||
|
|
||||||
char* temp = new char[infoLength] ;
|
char* temp = new char[infoLength] ;
|
||||||
glGetProgramInfoLog(glprogram, infoLength, NULL, temp);
|
glGetProgramInfoLog(glprogram, infoLength, NULL, temp);
|
||||||
|
|
||||||
qDebug() << "GLShader::compileShader - failed to LINK the gl program object :";
|
qDebug() << "GLShader::compileShader - failed to LINK the gl program object :";
|
||||||
qDebug() << temp;
|
qDebug() << temp;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
filestream.open("debugshader.glsl.info.txt");
|
filestream.open("debugshader.glsl.info.txt");
|
||||||
if (filestream.is_open()) {
|
if (filestream.is_open()) {
|
||||||
filestream << String(temp);
|
filestream << String(temp);
|
||||||
filestream.close();
|
filestream.close();
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
delete[] temp;
|
delete[] temp;
|
||||||
|
|
||||||
glDeleteShader(glshader);
|
glDeleteShader(glshader);
|
||||||
glDeleteProgram(glprogram);
|
glDeleteProgram(glprogram);
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// So far so good, the shader is created successfully
|
// So far so good, the shader is created successfully
|
||||||
GLBackend::GLShader* object = new GLBackend::GLShader();
|
GLBackend::GLShader* object = new GLBackend::GLShader();
|
||||||
object->_shader = glshader;
|
object->_shader = glshader;
|
||||||
object->_program = glprogram;
|
object->_program = glprogram;
|
||||||
|
|
||||||
makeBindings(object);
|
makeBindings(object);
|
||||||
|
|
||||||
return object;
|
return object;
|
||||||
}
|
}
|
||||||
|
|
||||||
GLBackend::GLShader* compileProgram(const Shader& program) {
|
GLBackend::GLShader* compileProgram(const Shader& program) {
|
||||||
if(!program.isProgram()) {
|
if(!program.isProgram()) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Let's go through every shaders and make sure they are ready to go
|
// Let's go through every shaders and make sure they are ready to go
|
||||||
std::vector< GLuint > shaderObjects;
|
std::vector< GLuint > shaderObjects;
|
||||||
for (auto subShader : program.getShaders()) {
|
for (auto subShader : program.getShaders()) {
|
||||||
GLuint so = GLBackend::getShaderID(subShader);
|
GLuint so = GLBackend::getShaderID(subShader);
|
||||||
if (!so) {
|
if (!so) {
|
||||||
qDebug() << "GLShader::compileProgram - One of the shaders of the program is not compiled?";
|
qDebug() << "GLShader::compileProgram - One of the shaders of the program is not compiled?";
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
shaderObjects.push_back(so);
|
shaderObjects.push_back(so);
|
||||||
}
|
}
|
||||||
|
|
||||||
// so far so good, program is almost done, need to link:
|
// so far so good, program is almost done, need to link:
|
||||||
GLuint glprogram = glCreateProgram();
|
GLuint glprogram = glCreateProgram();
|
||||||
if (!glprogram) {
|
if (!glprogram) {
|
||||||
qDebug() << "GLShader::compileProgram - failed to create the gl program object";
|
qDebug() << "GLShader::compileProgram - failed to create the gl program object";
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
// glProgramParameteri(glprogram, GL_PROGRAM_, GL_TRUE);
|
// glProgramParameteri(glprogram, GL_PROGRAM_, GL_TRUE);
|
||||||
// Create the program from the sub shaders
|
// Create the program from the sub shaders
|
||||||
for (auto so : shaderObjects) {
|
for (auto so : shaderObjects) {
|
||||||
glAttachShader(glprogram, so);
|
glAttachShader(glprogram, so);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Link!
|
// Link!
|
||||||
glLinkProgram(glprogram);
|
glLinkProgram(glprogram);
|
||||||
|
|
||||||
GLint linked = 0;
|
GLint linked = 0;
|
||||||
glGetProgramiv(glprogram, GL_LINK_STATUS, &linked);
|
glGetProgramiv(glprogram, GL_LINK_STATUS, &linked);
|
||||||
|
|
||||||
if (!linked) {
|
if (!linked) {
|
||||||
/*
|
/*
|
||||||
// save the source code to a temp file so we can debug easily
|
// save the source code to a temp file so we can debug easily
|
||||||
std::ofstream filestream;
|
std::ofstream filestream;
|
||||||
filestream.open("debugshader.glsl");
|
filestream.open("debugshader.glsl");
|
||||||
if (filestream.is_open()) {
|
if (filestream.is_open()) {
|
||||||
filestream << shaderSource->source;
|
filestream << shaderSource->source;
|
||||||
filestream.close();
|
filestream.close();
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
GLint infoLength = 0;
|
GLint infoLength = 0;
|
||||||
glGetProgramiv(glprogram, GL_INFO_LOG_LENGTH, &infoLength);
|
glGetProgramiv(glprogram, GL_INFO_LOG_LENGTH, &infoLength);
|
||||||
|
|
||||||
char* temp = new char[infoLength] ;
|
char* temp = new char[infoLength] ;
|
||||||
glGetProgramInfoLog(glprogram, infoLength, NULL, temp);
|
glGetProgramInfoLog(glprogram, infoLength, NULL, temp);
|
||||||
|
|
||||||
qDebug() << "GLShader::compileProgram - failed to LINK the gl program object :";
|
qDebug() << "GLShader::compileProgram - failed to LINK the gl program object :";
|
||||||
qDebug() << temp;
|
qDebug() << temp;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
filestream.open("debugshader.glsl.info.txt");
|
filestream.open("debugshader.glsl.info.txt");
|
||||||
if (filestream.is_open()) {
|
if (filestream.is_open()) {
|
||||||
filestream << std::string(temp);
|
filestream << std::string(temp);
|
||||||
filestream.close();
|
filestream.close();
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
delete[] temp;
|
delete[] temp;
|
||||||
|
|
||||||
glDeleteProgram(glprogram);
|
glDeleteProgram(glprogram);
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
// So far so good, the program is created successfully
|
// So far so good, the program is created successfully
|
||||||
GLBackend::GLShader* object = new GLBackend::GLShader();
|
GLBackend::GLShader* object = new GLBackend::GLShader();
|
||||||
object->_shader = 0;
|
object->_shader = 0;
|
||||||
object->_program = glprogram;
|
object->_program = glprogram;
|
||||||
|
|
||||||
makeBindings(object);
|
makeBindings(object);
|
||||||
|
|
||||||
return object;
|
return object;
|
||||||
}
|
}
|
||||||
|
|
||||||
GLBackend::GLShader* GLBackend::syncGPUObject(const Shader& shader) {
|
GLBackend::GLShader* GLBackend::syncGPUObject(const Shader& shader) {
|
||||||
|
@ -360,127 +361,135 @@ ElementResource getFormatFromGLUniform(GLenum gltype) {
|
||||||
case GL_FLOAT_VEC2: return ElementResource(Element(VEC2, gpu::FLOAT, UNIFORM), Resource::BUFFER);
|
case GL_FLOAT_VEC2: return ElementResource(Element(VEC2, gpu::FLOAT, UNIFORM), Resource::BUFFER);
|
||||||
case GL_FLOAT_VEC3: return ElementResource(Element(VEC3, gpu::FLOAT, UNIFORM), Resource::BUFFER);
|
case GL_FLOAT_VEC3: return ElementResource(Element(VEC3, gpu::FLOAT, UNIFORM), Resource::BUFFER);
|
||||||
case GL_FLOAT_VEC4: return ElementResource(Element(VEC4, gpu::FLOAT, UNIFORM), Resource::BUFFER);
|
case GL_FLOAT_VEC4: return ElementResource(Element(VEC4, gpu::FLOAT, UNIFORM), Resource::BUFFER);
|
||||||
|
/*
|
||||||
case GL_DOUBLE: return ElementResource(Element(SCALAR, gpu::FLOAT, UNIFORM), Resource::BUFFER);
|
case GL_DOUBLE: return ElementResource(Element(SCALAR, gpu::FLOAT, UNIFORM), Resource::BUFFER);
|
||||||
case GL_DOUBLE_VEC2: return ElementResource(Element(VEC2, gpu::FLOAT, UNIFORM), Resource::BUFFER);
|
case GL_DOUBLE_VEC2: return ElementResource(Element(VEC2, gpu::FLOAT, UNIFORM), Resource::BUFFER);
|
||||||
case GL_DOUBLE_VEC3: return ElementResource(Element(VEC3, gpu::FLOAT, UNIFORM), Resource::BUFFER);
|
case GL_DOUBLE_VEC3: return ElementResource(Element(VEC3, gpu::FLOAT, UNIFORM), Resource::BUFFER);
|
||||||
case GL_DOUBLE_VEC4: return ElementResource(Element(VEC4, gpu::FLOAT, UNIFORM), Resource::BUFFER);
|
case GL_DOUBLE_VEC4: return ElementResource(Element(VEC4, gpu::FLOAT, UNIFORM), Resource::BUFFER);
|
||||||
|
*/
|
||||||
case GL_INT: return ElementResource(Element(SCALAR, gpu::INT32, UNIFORM), Resource::BUFFER);
|
case GL_INT: return ElementResource(Element(SCALAR, gpu::INT32, UNIFORM), Resource::BUFFER);
|
||||||
case GL_INT_VEC2: return ElementResource(Element(VEC2, gpu::INT32, UNIFORM), Resource::BUFFER);
|
case GL_INT_VEC2: return ElementResource(Element(VEC2, gpu::INT32, UNIFORM), Resource::BUFFER);
|
||||||
case GL_INT_VEC3: return ElementResource(Element(VEC3, gpu::INT32, UNIFORM), Resource::BUFFER);
|
case GL_INT_VEC3: return ElementResource(Element(VEC3, gpu::INT32, UNIFORM), Resource::BUFFER);
|
||||||
case GL_INT_VEC4: return ElementResource(Element(VEC4, gpu::INT32, UNIFORM), Resource::BUFFER);
|
case GL_INT_VEC4: return ElementResource(Element(VEC4, gpu::INT32, UNIFORM), Resource::BUFFER);
|
||||||
|
|
||||||
case GL_UNSIGNED_INT: return ElementResource(Element(SCALAR, gpu::UINT32, UNIFORM), Resource::BUFFER);
|
case GL_UNSIGNED_INT: return ElementResource(Element(SCALAR, gpu::UINT32, UNIFORM), Resource::BUFFER);
|
||||||
|
#if defined(Q_OS_WIN)
|
||||||
case GL_UNSIGNED_INT_VEC2: return ElementResource(Element(VEC2, gpu::UINT32, UNIFORM), Resource::BUFFER);
|
case GL_UNSIGNED_INT_VEC2: return ElementResource(Element(VEC2, gpu::UINT32, UNIFORM), Resource::BUFFER);
|
||||||
case GL_UNSIGNED_INT_VEC3: return ElementResource(Element(VEC3, gpu::UINT32, UNIFORM), Resource::BUFFER);
|
case GL_UNSIGNED_INT_VEC3: return ElementResource(Element(VEC3, gpu::UINT32, UNIFORM), Resource::BUFFER);
|
||||||
case GL_UNSIGNED_INT_VEC4: return ElementResource(Element(VEC4, gpu::UINT32, UNIFORM), Resource::BUFFER);
|
case GL_UNSIGNED_INT_VEC4: return ElementResource(Element(VEC4, gpu::UINT32, UNIFORM), Resource::BUFFER);
|
||||||
|
#endif
|
||||||
|
|
||||||
case GL_BOOL: return ElementResource(Element(SCALAR, gpu::BOOL, UNIFORM), Resource::BUFFER);
|
case GL_BOOL: return ElementResource(Element(SCALAR, gpu::BOOL, UNIFORM), Resource::BUFFER);
|
||||||
case GL_BOOL_VEC2: return ElementResource(Element(VEC2, gpu::BOOL, UNIFORM), Resource::BUFFER);
|
case GL_BOOL_VEC2: return ElementResource(Element(VEC2, gpu::BOOL, UNIFORM), Resource::BUFFER);
|
||||||
case GL_BOOL_VEC3: return ElementResource(Element(VEC3, gpu::BOOL, UNIFORM), Resource::BUFFER);
|
case GL_BOOL_VEC3: return ElementResource(Element(VEC3, gpu::BOOL, UNIFORM), Resource::BUFFER);
|
||||||
case GL_BOOL_VEC4: return ElementResource(Element(VEC4, gpu::BOOL, UNIFORM), Resource::BUFFER);
|
case GL_BOOL_VEC4: return ElementResource(Element(VEC4, gpu::BOOL, UNIFORM), Resource::BUFFER);
|
||||||
|
|
||||||
|
|
||||||
case GL_FLOAT_MAT2: return ElementResource(Element(gpu::MAT2, gpu::FLOAT, UNIFORM), Resource::BUFFER);
|
case GL_FLOAT_MAT2: return ElementResource(Element(gpu::MAT2, gpu::FLOAT, UNIFORM), Resource::BUFFER);
|
||||||
case GL_FLOAT_MAT3: return ElementResource(Element(MAT3, gpu::FLOAT, UNIFORM), Resource::BUFFER);
|
case GL_FLOAT_MAT3: return ElementResource(Element(MAT3, gpu::FLOAT, UNIFORM), Resource::BUFFER);
|
||||||
case GL_FLOAT_MAT4: return ElementResource(Element(MAT4, gpu::FLOAT, UNIFORM), Resource::BUFFER);
|
case GL_FLOAT_MAT4: return ElementResource(Element(MAT4, gpu::FLOAT, UNIFORM), Resource::BUFFER);
|
||||||
|
|
||||||
/* {GL_FLOAT_MAT2x3 mat2x3},
|
/* {GL_FLOAT_MAT2x3 mat2x3},
|
||||||
{GL_FLOAT_MAT2x4 mat2x4},
|
{GL_FLOAT_MAT2x4 mat2x4},
|
||||||
{GL_FLOAT_MAT3x2 mat3x2},
|
{GL_FLOAT_MAT3x2 mat3x2},
|
||||||
{GL_FLOAT_MAT3x4 mat3x4},
|
{GL_FLOAT_MAT3x4 mat3x4},
|
||||||
{GL_FLOAT_MAT4x2 mat4x2},
|
{GL_FLOAT_MAT4x2 mat4x2},
|
||||||
{GL_FLOAT_MAT4x3 mat4x3},
|
{GL_FLOAT_MAT4x3 mat4x3},
|
||||||
{GL_DOUBLE_MAT2 dmat2},
|
{GL_DOUBLE_MAT2 dmat2},
|
||||||
{GL_DOUBLE_MAT3 dmat3},
|
{GL_DOUBLE_MAT3 dmat3},
|
||||||
{GL_DOUBLE_MAT4 dmat4},
|
{GL_DOUBLE_MAT4 dmat4},
|
||||||
{GL_DOUBLE_MAT2x3 dmat2x3},
|
{GL_DOUBLE_MAT2x3 dmat2x3},
|
||||||
{GL_DOUBLE_MAT2x4 dmat2x4},
|
{GL_DOUBLE_MAT2x4 dmat2x4},
|
||||||
{GL_DOUBLE_MAT3x2 dmat3x2},
|
{GL_DOUBLE_MAT3x2 dmat3x2},
|
||||||
{GL_DOUBLE_MAT3x4 dmat3x4},
|
{GL_DOUBLE_MAT3x4 dmat3x4},
|
||||||
{GL_DOUBLE_MAT4x2 dmat4x2},
|
{GL_DOUBLE_MAT4x2 dmat4x2},
|
||||||
{GL_DOUBLE_MAT4x3 dmat4x3},
|
{GL_DOUBLE_MAT4x3 dmat4x3},
|
||||||
*/
|
*/
|
||||||
|
|
||||||
case GL_SAMPLER_1D: return ElementResource(Element(SCALAR, gpu::FLOAT, SAMPLER), Resource::TEXTURE_1D);
|
case GL_SAMPLER_1D: return ElementResource(Element(SCALAR, gpu::FLOAT, SAMPLER), Resource::TEXTURE_1D);
|
||||||
case GL_SAMPLER_2D: return ElementResource(Element(SCALAR, gpu::FLOAT, SAMPLER), Resource::TEXTURE_2D);
|
case GL_SAMPLER_2D: return ElementResource(Element(SCALAR, gpu::FLOAT, SAMPLER), Resource::TEXTURE_2D);
|
||||||
case GL_SAMPLER_2D_MULTISAMPLE: return ElementResource(Element(SCALAR, gpu::FLOAT, SAMPLER_MULTISAMPLE), Resource::TEXTURE_2D);
|
|
||||||
case GL_SAMPLER_3D: return ElementResource(Element(SCALAR, gpu::FLOAT, SAMPLER), Resource::TEXTURE_3D);
|
case GL_SAMPLER_3D: return ElementResource(Element(SCALAR, gpu::FLOAT, SAMPLER), Resource::TEXTURE_3D);
|
||||||
case GL_SAMPLER_CUBE: return ElementResource(Element(SCALAR, gpu::FLOAT, SAMPLER), Resource::TEXTURE_CUBE);
|
case GL_SAMPLER_CUBE: return ElementResource(Element(SCALAR, gpu::FLOAT, SAMPLER), Resource::TEXTURE_CUBE);
|
||||||
|
|
||||||
|
#if defined(Q_OS_WIN)
|
||||||
|
case GL_SAMPLER_2D_MULTISAMPLE: return ElementResource(Element(SCALAR, gpu::FLOAT, SAMPLER_MULTISAMPLE), Resource::TEXTURE_2D);
|
||||||
case GL_SAMPLER_1D_ARRAY: return ElementResource(Element(SCALAR, gpu::FLOAT, SAMPLER), Resource::TEXTURE_1D_ARRAY);
|
case GL_SAMPLER_1D_ARRAY: return ElementResource(Element(SCALAR, gpu::FLOAT, SAMPLER), Resource::TEXTURE_1D_ARRAY);
|
||||||
case GL_SAMPLER_2D_ARRAY: return ElementResource(Element(SCALAR, gpu::FLOAT, SAMPLER), Resource::TEXTURE_2D_ARRAY);
|
case GL_SAMPLER_2D_ARRAY: return ElementResource(Element(SCALAR, gpu::FLOAT, SAMPLER), Resource::TEXTURE_2D_ARRAY);
|
||||||
case GL_SAMPLER_2D_MULTISAMPLE_ARRAY: return ElementResource(Element(SCALAR, gpu::FLOAT, SAMPLER_MULTISAMPLE), Resource::TEXTURE_2D_ARRAY);
|
case GL_SAMPLER_2D_MULTISAMPLE_ARRAY: return ElementResource(Element(SCALAR, gpu::FLOAT, SAMPLER_MULTISAMPLE), Resource::TEXTURE_2D_ARRAY);
|
||||||
|
#endif
|
||||||
|
|
||||||
case GL_SAMPLER_2D_SHADOW: return ElementResource(Element(SCALAR, gpu::FLOAT, SAMPLER_SHADOW), Resource::TEXTURE_2D);
|
case GL_SAMPLER_2D_SHADOW: return ElementResource(Element(SCALAR, gpu::FLOAT, SAMPLER_SHADOW), Resource::TEXTURE_2D);
|
||||||
|
#if defined(Q_OS_WIN)
|
||||||
case GL_SAMPLER_CUBE_SHADOW: return ElementResource(Element(SCALAR, gpu::FLOAT, SAMPLER_SHADOW), Resource::TEXTURE_CUBE);
|
case GL_SAMPLER_CUBE_SHADOW: return ElementResource(Element(SCALAR, gpu::FLOAT, SAMPLER_SHADOW), Resource::TEXTURE_CUBE);
|
||||||
|
|
||||||
case GL_SAMPLER_2D_ARRAY_SHADOW: return ElementResource(Element(SCALAR, gpu::FLOAT, SAMPLER_SHADOW), Resource::TEXTURE_2D_ARRAY);
|
case GL_SAMPLER_2D_ARRAY_SHADOW: return ElementResource(Element(SCALAR, gpu::FLOAT, SAMPLER_SHADOW), Resource::TEXTURE_2D_ARRAY);
|
||||||
|
#endif
|
||||||
// {GL_SAMPLER_1D_SHADOW sampler1DShadow},
|
|
||||||
// {GL_SAMPLER_1D_ARRAY_SHADOW sampler1DArrayShadow},
|
// {GL_SAMPLER_1D_SHADOW sampler1DShadow},
|
||||||
|
// {GL_SAMPLER_1D_ARRAY_SHADOW sampler1DArrayShadow},
|
||||||
// {GL_SAMPLER_BUFFER samplerBuffer},
|
|
||||||
// {GL_SAMPLER_2D_RECT sampler2DRect},
|
// {GL_SAMPLER_BUFFER samplerBuffer},
|
||||||
// {GL_SAMPLER_2D_RECT_SHADOW sampler2DRectShadow},
|
// {GL_SAMPLER_2D_RECT sampler2DRect},
|
||||||
|
// {GL_SAMPLER_2D_RECT_SHADOW sampler2DRectShadow},
|
||||||
|
|
||||||
|
#if defined(Q_OS_WIN)
|
||||||
case GL_INT_SAMPLER_1D: return ElementResource(Element(SCALAR, gpu::INT32, SAMPLER), Resource::TEXTURE_1D);
|
case GL_INT_SAMPLER_1D: return ElementResource(Element(SCALAR, gpu::INT32, SAMPLER), Resource::TEXTURE_1D);
|
||||||
case GL_INT_SAMPLER_2D: return ElementResource(Element(SCALAR, gpu::INT32, SAMPLER), Resource::TEXTURE_2D);
|
case GL_INT_SAMPLER_2D: return ElementResource(Element(SCALAR, gpu::INT32, SAMPLER), Resource::TEXTURE_2D);
|
||||||
case GL_INT_SAMPLER_2D_MULTISAMPLE: return ElementResource(Element(SCALAR, gpu::INT32, SAMPLER_MULTISAMPLE), Resource::TEXTURE_2D);
|
case GL_INT_SAMPLER_2D_MULTISAMPLE: return ElementResource(Element(SCALAR, gpu::INT32, SAMPLER_MULTISAMPLE), Resource::TEXTURE_2D);
|
||||||
case GL_INT_SAMPLER_3D: return ElementResource(Element(SCALAR, gpu::INT32, SAMPLER), Resource::TEXTURE_3D);
|
case GL_INT_SAMPLER_3D: return ElementResource(Element(SCALAR, gpu::INT32, SAMPLER), Resource::TEXTURE_3D);
|
||||||
case GL_INT_SAMPLER_CUBE: return ElementResource(Element(SCALAR, gpu::INT32, SAMPLER), Resource::TEXTURE_CUBE);
|
case GL_INT_SAMPLER_CUBE: return ElementResource(Element(SCALAR, gpu::INT32, SAMPLER), Resource::TEXTURE_CUBE);
|
||||||
|
|
||||||
case GL_INT_SAMPLER_1D_ARRAY: return ElementResource(Element(SCALAR, gpu::INT32, SAMPLER), Resource::TEXTURE_1D_ARRAY);
|
case GL_INT_SAMPLER_1D_ARRAY: return ElementResource(Element(SCALAR, gpu::INT32, SAMPLER), Resource::TEXTURE_1D_ARRAY);
|
||||||
case GL_INT_SAMPLER_2D_ARRAY: return ElementResource(Element(SCALAR, gpu::INT32, SAMPLER), Resource::TEXTURE_2D_ARRAY);
|
case GL_INT_SAMPLER_2D_ARRAY: return ElementResource(Element(SCALAR, gpu::INT32, SAMPLER), Resource::TEXTURE_2D_ARRAY);
|
||||||
case GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY: return ElementResource(Element(SCALAR, gpu::INT32, SAMPLER_MULTISAMPLE), Resource::TEXTURE_2D_ARRAY);
|
case GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY: return ElementResource(Element(SCALAR, gpu::INT32, SAMPLER_MULTISAMPLE), Resource::TEXTURE_2D_ARRAY);
|
||||||
|
|
||||||
// {GL_INT_SAMPLER_BUFFER isamplerBuffer},
|
// {GL_INT_SAMPLER_BUFFER isamplerBuffer},
|
||||||
// {GL_INT_SAMPLER_2D_RECT isampler2DRect},
|
// {GL_INT_SAMPLER_2D_RECT isampler2DRect},
|
||||||
|
|
||||||
case GL_UNSIGNED_INT_SAMPLER_1D: return ElementResource(Element(SCALAR, gpu::UINT32, SAMPLER), Resource::TEXTURE_1D);
|
case GL_UNSIGNED_INT_SAMPLER_1D: return ElementResource(Element(SCALAR, gpu::UINT32, SAMPLER), Resource::TEXTURE_1D);
|
||||||
case GL_UNSIGNED_INT_SAMPLER_2D: return ElementResource(Element(SCALAR, gpu::UINT32, SAMPLER), Resource::TEXTURE_2D);
|
case GL_UNSIGNED_INT_SAMPLER_2D: return ElementResource(Element(SCALAR, gpu::UINT32, SAMPLER), Resource::TEXTURE_2D);
|
||||||
case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE: return ElementResource(Element(SCALAR, gpu::UINT32, SAMPLER_MULTISAMPLE), Resource::TEXTURE_2D);
|
case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE: return ElementResource(Element(SCALAR, gpu::UINT32, SAMPLER_MULTISAMPLE), Resource::TEXTURE_2D);
|
||||||
case GL_UNSIGNED_INT_SAMPLER_3D: return ElementResource(Element(SCALAR, gpu::UINT32, SAMPLER), Resource::TEXTURE_3D);
|
case GL_UNSIGNED_INT_SAMPLER_3D: return ElementResource(Element(SCALAR, gpu::UINT32, SAMPLER), Resource::TEXTURE_3D);
|
||||||
case GL_UNSIGNED_INT_SAMPLER_CUBE: return ElementResource(Element(SCALAR, gpu::UINT32, SAMPLER), Resource::TEXTURE_CUBE);
|
case GL_UNSIGNED_INT_SAMPLER_CUBE: return ElementResource(Element(SCALAR, gpu::UINT32, SAMPLER), Resource::TEXTURE_CUBE);
|
||||||
|
|
||||||
case GL_UNSIGNED_INT_SAMPLER_1D_ARRAY: return ElementResource(Element(SCALAR, gpu::UINT32, SAMPLER), Resource::TEXTURE_1D_ARRAY);
|
case GL_UNSIGNED_INT_SAMPLER_1D_ARRAY: return ElementResource(Element(SCALAR, gpu::UINT32, SAMPLER), Resource::TEXTURE_1D_ARRAY);
|
||||||
case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY: return ElementResource(Element(SCALAR, gpu::UINT32, SAMPLER), Resource::TEXTURE_2D_ARRAY);
|
case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY: return ElementResource(Element(SCALAR, gpu::UINT32, SAMPLER), Resource::TEXTURE_2D_ARRAY);
|
||||||
case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY: return ElementResource(Element(SCALAR, gpu::UINT32, SAMPLER_MULTISAMPLE), Resource::TEXTURE_2D_ARRAY);
|
case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY: return ElementResource(Element(SCALAR, gpu::UINT32, SAMPLER_MULTISAMPLE), Resource::TEXTURE_2D_ARRAY);
|
||||||
|
#endif
|
||||||
// {GL_UNSIGNED_INT_SAMPLER_BUFFER usamplerBuffer},
|
// {GL_UNSIGNED_INT_SAMPLER_BUFFER usamplerBuffer},
|
||||||
// {GL_UNSIGNED_INT_SAMPLER_2D_RECT usampler2DRect},
|
// {GL_UNSIGNED_INT_SAMPLER_2D_RECT usampler2DRect},
|
||||||
/*
|
/*
|
||||||
{GL_IMAGE_1D image1D},
|
{GL_IMAGE_1D image1D},
|
||||||
{GL_IMAGE_2D image2D},
|
{GL_IMAGE_2D image2D},
|
||||||
{GL_IMAGE_3D image3D},
|
{GL_IMAGE_3D image3D},
|
||||||
{GL_IMAGE_2D_RECT image2DRect},
|
{GL_IMAGE_2D_RECT image2DRect},
|
||||||
{GL_IMAGE_CUBE imageCube},
|
{GL_IMAGE_CUBE imageCube},
|
||||||
{GL_IMAGE_BUFFER imageBuffer},
|
{GL_IMAGE_BUFFER imageBuffer},
|
||||||
{GL_IMAGE_1D_ARRAY image1DArray},
|
{GL_IMAGE_1D_ARRAY image1DArray},
|
||||||
{GL_IMAGE_2D_ARRAY image2DArray},
|
{GL_IMAGE_2D_ARRAY image2DArray},
|
||||||
{GL_IMAGE_2D_MULTISAMPLE image2DMS},
|
{GL_IMAGE_2D_MULTISAMPLE image2DMS},
|
||||||
{GL_IMAGE_2D_MULTISAMPLE_ARRAY image2DMSArray},
|
{GL_IMAGE_2D_MULTISAMPLE_ARRAY image2DMSArray},
|
||||||
{GL_INT_IMAGE_1D iimage1D},
|
{GL_INT_IMAGE_1D iimage1D},
|
||||||
{GL_INT_IMAGE_2D iimage2D},
|
{GL_INT_IMAGE_2D iimage2D},
|
||||||
{GL_INT_IMAGE_3D iimage3D},
|
{GL_INT_IMAGE_3D iimage3D},
|
||||||
{GL_INT_IMAGE_2D_RECT iimage2DRect},
|
{GL_INT_IMAGE_2D_RECT iimage2DRect},
|
||||||
{GL_INT_IMAGE_CUBE iimageCube},
|
{GL_INT_IMAGE_CUBE iimageCube},
|
||||||
{GL_INT_IMAGE_BUFFER iimageBuffer},
|
{GL_INT_IMAGE_BUFFER iimageBuffer},
|
||||||
{GL_INT_IMAGE_1D_ARRAY iimage1DArray},
|
{GL_INT_IMAGE_1D_ARRAY iimage1DArray},
|
||||||
{GL_INT_IMAGE_2D_ARRAY iimage2DArray},
|
{GL_INT_IMAGE_2D_ARRAY iimage2DArray},
|
||||||
{GL_INT_IMAGE_2D_MULTISAMPLE iimage2DMS},
|
{GL_INT_IMAGE_2D_MULTISAMPLE iimage2DMS},
|
||||||
{GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY iimage2DMSArray},
|
{GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY iimage2DMSArray},
|
||||||
{GL_UNSIGNED_INT_IMAGE_1D uimage1D},
|
{GL_UNSIGNED_INT_IMAGE_1D uimage1D},
|
||||||
{GL_UNSIGNED_INT_IMAGE_2D uimage2D},
|
{GL_UNSIGNED_INT_IMAGE_2D uimage2D},
|
||||||
{GL_UNSIGNED_INT_IMAGE_3D uimage3D},
|
{GL_UNSIGNED_INT_IMAGE_3D uimage3D},
|
||||||
{GL_UNSIGNED_INT_IMAGE_2D_RECT uimage2DRect},
|
{GL_UNSIGNED_INT_IMAGE_2D_RECT uimage2DRect},
|
||||||
{GL_UNSIGNED_INT_IMAGE_CUBE uimageCube},+ [0] {_name="fInnerRadius" _location=0 _element={_semantic=15 '\xf' _dimension=0 '\0' _type=0 '\0' } } gpu::Shader::Slot
|
{GL_UNSIGNED_INT_IMAGE_CUBE uimageCube},+ [0] {_name="fInnerRadius" _location=0 _element={_semantic=15 '\xf' _dimension=0 '\0' _type=0 '\0' } } gpu::Shader::Slot
|
||||||
|
|
||||||
{GL_UNSIGNED_INT_IMAGE_BUFFER uimageBuffer},
|
{GL_UNSIGNED_INT_IMAGE_BUFFER uimageBuffer},
|
||||||
{GL_UNSIGNED_INT_IMAGE_1D_ARRAY uimage1DArray},
|
{GL_UNSIGNED_INT_IMAGE_1D_ARRAY uimage1DArray},
|
||||||
{GL_UNSIGNED_INT_IMAGE_2D_ARRAY uimage2DArray},
|
{GL_UNSIGNED_INT_IMAGE_2D_ARRAY uimage2DArray},
|
||||||
{GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE uimage2DMS},
|
{GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE uimage2DMS},
|
||||||
{GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY uimage2DMSArray},
|
{GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY uimage2DMSArray},
|
||||||
{GL_UNSIGNED_INT_ATOMIC_COUNTER atomic_uint}
|
{GL_UNSIGNED_INT_ATOMIC_COUNTER atomic_uint}
|
||||||
*/
|
*/
|
||||||
|
@ -542,6 +551,7 @@ bool isUnusedSlot(GLint binding) {
|
||||||
|
|
||||||
int makeUniformBlockSlots(GLuint glprogram, const Shader::BindingSet& slotBindings, Shader::SlotSet& buffers) {
|
int makeUniformBlockSlots(GLuint glprogram, const Shader::BindingSet& slotBindings, Shader::SlotSet& buffers) {
|
||||||
GLint buffersCount = 0;
|
GLint buffersCount = 0;
|
||||||
|
#if defined(Q_OS_WIN)
|
||||||
glGetProgramiv(glprogram, GL_ACTIVE_UNIFORM_BLOCKS, &buffersCount);
|
glGetProgramiv(glprogram, GL_ACTIVE_UNIFORM_BLOCKS, &buffersCount);
|
||||||
|
|
||||||
// fast exit
|
// fast exit
|
||||||
|
@ -595,7 +605,7 @@ int makeUniformBlockSlots(GLuint glprogram, const Shader::BindingSet& slotBindin
|
||||||
Element element(SCALAR, gpu::UINT32, gpu::UNIFORM_BUFFER);
|
Element element(SCALAR, gpu::UINT32, gpu::UNIFORM_BUFFER);
|
||||||
buffers.insert(Shader::Slot(name, binding, element, Resource::BUFFER));
|
buffers.insert(Shader::Slot(name, binding, element, Resource::BUFFER));
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
return buffersCount;
|
return buffersCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -154,12 +154,9 @@ SunSkyStage::SunSkyStage() :
|
||||||
// Begining of march
|
// Begining of march
|
||||||
setYearTime(60.0f);
|
setYearTime(60.0f);
|
||||||
|
|
||||||
auto skyShader = gpu::ShaderPointer(
|
auto skyFromAtmosphereVertex = gpu::ShaderPointer(gpu::Shader::createVertex(std::string(SkyFromAtmosphere_vert)));
|
||||||
gpu::Shader::createProgram(
|
auto skyFromAtmosphereFragment = gpu::ShaderPointer(gpu::Shader::createPixel(std::string(SkyFromAtmosphere_frag)));
|
||||||
gpu::ShaderPointer(gpu::Shader::createVertex(std::string(SkyFromAtmosphere_vert))),
|
auto skyShader = gpu::ShaderPointer(gpu::Shader::createProgram(skyFromAtmosphereVertex, skyFromAtmosphereFragment));
|
||||||
gpu::ShaderPointer(gpu::Shader::createPixel(std::string(SkyFromAtmosphere_frag)))
|
|
||||||
)
|
|
||||||
);
|
|
||||||
_skyPipeline = gpu::PipelinePointer(gpu::Pipeline::create(skyShader, gpu::States()));
|
_skyPipeline = gpu::PipelinePointer(gpu::Pipeline::create(skyShader, gpu::States()));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue