OPENGL有一种不用绑定贴图单元的方法,直接一次性加载到uniform buffer中。
这就是加载时候稍微用时间,之后
的效率大大高于glActiveTexture(GL_TEXTUREi)之类这样的方法。
但是依然你要在每个材质写出这个uniformbuffer object的入口。
如2个贴图:
1,使用贴图单元:
glsl得vert shading以下全部不变
#version 450 core layout (location = 0) in vec3 P; layout (location = 1) in vec3 Cd; layout (location = 2) in vec2 texCoords; out vec3 FS_Cd; out vec2 FS_texCoords; void main() { gl_Position = vec4(P, 1.0); FS_Cd = Cd; FS_texCoords = texCoords; }
fragment:
#version 450 core #extension GL_ARB_bindless_texture : require in vec3 FS_Cd; in vec2 FS_texCoords; // ----------this is for test--------------- uniform sampler2D img1; uniform sampler2D img2; // ----------this is for test--------------- out vec4 color; void main() { vec3 img1rgb = texture(img1, FS_texCoords).rgb ; vec3 img2rgb = texture(img2, FS_texCoords).rgb ; img1rgb = pow(img1rgb,vec3(1/2.2) ); img2rgb = pow(img2rgb,vec3(1/2.2) ); color = vec4(img1rgb, 1.0); }
// // Created by admin on 2020/6/8. // #ifndef TRIANGLE_ERRORCHECK_H #define TRIANGLE_ERRORCHECK_H #include <iostream> #include <string> namespace AlgebraMaster { using namespace std; #include <GL/glew.h> void CHECK_PROGRAM(const GLuint &program); void CHECK_PROGRAM(const GLuint &program){ GLint success; GLchar infoLog[1024]; glGetProgramiv(program, GL_LINK_STATUS, &success); if(!success) { glGetProgramInfoLog(program, 1024, NULL, infoLog); std::cout << "ERROR::PROGRAM_LINKING_ERROR of ID: " << program << "\n" << infoLog << "\n -- --------------------------------------------------- -- " << std::endl; } } void CHECK_SHADER(const GLuint & shader,const char *shaderType); void CHECK_SHADER(const GLuint & shader,const char *shaderType){ GLint success; GLchar infoLog[1024]; glGetShaderiv(shader, GL_COMPILE_STATUS, &success); if(!success) { glGetShaderInfoLog(shader, 1024, NULL, infoLog); std::cout << "ERROR::SHADER_COMPILATION_ERROR of type: " << shaderType << "\n" << infoLog << "\n -- --------------------------------------------------- -- " << std::endl; } } } #endif //TRIANGLE_ERRORCHECK_H