1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| t_texture* glsl_texture_create(const char *name, t_s_int32 format, t_u_int32 width, t_u_int32 height, t_u_int32 levels, t_u_int32 clamping, t_u_int32 interpol) {
t_texture *tex = (t_texture*)memory_malloc_shared(sizeof(t_texture));
tex->format = format;
tex->width[0] = width;
tex->height[0] = height;
tex->levels = levels;
tex->target = GL_TEXTURE_2D; //GL_TEXTURE_RECTANGLE_ARB
strcpy(tex->name, name);
t_u_int32 i;
for (i = 1; i < levels; i++) {
tex->width[i] = tex->width[i - 1] / 2;
tex->height[i] = tex->height[i - 1] / 2;
}
glGenTextures(1, &tex->handle);
GLH_CHECKERROR();
glBindTexture(tex->target, tex->handle);
GLH_CHECKERROR();
float v[] = {0.0, 0.0, 0.0, 0.0};
glTexParameteriv(tex->target, GL_TEXTURE_BORDER_COLOR, (const GLint*)v);
glTexParameteri(tex->target, GL_TEXTURE_WRAP_S, clamping);
glTexParameteri(tex->target, GL_TEXTURE_WRAP_T, clamping);
glTexParameteri(tex->target, GL_TEXTURE_MAG_FILTER, interpol);
glTexParameteri(tex->target, GL_TEXTURE_MIN_FILTER, (levels > 1) ? GL_LINEAR_MIPMAP_LINEAR : interpol);
glTexImage2D(tex->target, 0, tex->format, width, height, 0, GL_RGBA, GL_FLOAT, NULL);
GLH_CHECKERROR();
if (levels > 1)
glGenerateMipmapEXT(tex->target);
return tex;
} |
Partager