add guMakeProgram{,FromSource,FromFiles}()
This commit is contained in:
parent
6ad367812b
commit
921ea83b01
@ -272,3 +272,60 @@ GLuint guMakeBuffer(GLenum target, GLenum usage, const void *ptr, size_t sz)
|
|||||||
glBufferData(target, sz, ptr, usage);
|
glBufferData(target, sz, ptr, usage);
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GLuint guMakeProgramFromSource(const char *v_shader, const char *f_shader,
|
||||||
|
guAttribBinding *bindings)
|
||||||
|
{
|
||||||
|
GLuint v_shader_id = guMakeShader(GL_VERTEX_SHADER, v_shader);
|
||||||
|
GLuint f_shader_id = guMakeShader(GL_FRAGMENT_SHADER, f_shader);
|
||||||
|
if (v_shader_id <= 0 || f_shader_id <= 0)
|
||||||
|
return 0;
|
||||||
|
GLuint id = guMakeProgram(v_shader_id, f_shader_id, bindings);
|
||||||
|
glDeleteShader(v_shader_id);
|
||||||
|
glDeleteShader(f_shader_id);
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
GLuint guMakeProgramFromFiles(const char *v_shader, const char *f_shader,
|
||||||
|
guAttribBinding *bindings)
|
||||||
|
{
|
||||||
|
GLuint v_shader_id = guMakeShaderFromFile(GL_VERTEX_SHADER, v_shader);
|
||||||
|
GLuint f_shader_id = guMakeShaderFromFile(GL_FRAGMENT_SHADER, f_shader);
|
||||||
|
if (v_shader_id <= 0 || f_shader_id <= 0)
|
||||||
|
return 0;
|
||||||
|
GLuint id = guMakeProgram(v_shader_id, f_shader_id, bindings);
|
||||||
|
glDeleteShader(v_shader_id);
|
||||||
|
glDeleteShader(f_shader_id);
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
GLuint guMakeProgram(GLuint v_shader_id, GLuint f_shader_id,
|
||||||
|
guAttribBinding *bindings)
|
||||||
|
{
|
||||||
|
GLuint program = glCreateProgram();
|
||||||
|
glAttachShader(program, v_shader_id);
|
||||||
|
glAttachShader(program, f_shader_id);
|
||||||
|
|
||||||
|
if (bindings != NULL)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i = 0; bindings[i].index > 0 && bindings[i].name != NULL; i++)
|
||||||
|
{
|
||||||
|
glBindAttribLocation(program, bindings[i].index, bindings[i].name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
glLinkProgram(program);
|
||||||
|
|
||||||
|
GLint link_status;
|
||||||
|
glGetProgramiv(program, GL_LINK_STATUS, &link_status);
|
||||||
|
if (link_status != GL_TRUE)
|
||||||
|
{
|
||||||
|
char *log = guGetProgramLog(program);
|
||||||
|
fprintf(stderr, "Program log:\n%s\n", log);
|
||||||
|
free(log);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return program;
|
||||||
|
}
|
||||||
|
@ -9,6 +9,10 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef GLfloat guMatrix4x4[4][4];
|
typedef GLfloat guMatrix4x4[4][4];
|
||||||
|
typedef struct {
|
||||||
|
GLuint index;
|
||||||
|
const GLchar *name;
|
||||||
|
} guAttribBinding;
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
@ -35,6 +39,12 @@ char *guGetProgramLog(GLuint id);
|
|||||||
GLuint guMakeShaderFromFile(GLenum shaderType, const char *fname);
|
GLuint guMakeShaderFromFile(GLenum shaderType, const char *fname);
|
||||||
GLuint guMakeShader(GLenum shaderType, const char *source);
|
GLuint guMakeShader(GLenum shaderType, const char *source);
|
||||||
GLuint guMakeBuffer(GLenum target, GLenum usage, const void *ptr, size_t sz);
|
GLuint guMakeBuffer(GLenum target, GLenum usage, const void *ptr, size_t sz);
|
||||||
|
GLuint guMakeProgramFromSource(const char *v_shader, const char *f_shader,
|
||||||
|
guAttribBinding *bindings);
|
||||||
|
GLuint guMakeProgramFromFiles(const char *v_shader, const char *f_shader,
|
||||||
|
guAttribBinding *bindings);
|
||||||
|
GLuint guMakeProgram(GLuint v_shader_id, GLuint f_shader_id,
|
||||||
|
guAttribBinding *bindings);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user