OPENGL有一种不用绑定贴图单元的方法,直接一次性加载到uniform buffer中。

这就是加载时候稍微用时间,之后

的效率大大高于glActiveTexture(GL_TEXTUREi)之类这样的方法。

但是依然你要在每个材质写出这个uniformbuffer object的入口。

 

如2个贴图:

OpenGL Bindless Texture

 

 

 OpenGL Bindless Texture

 

 

 

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
errorCheck.h

相关文章:

  • 2021-12-04
  • 2022-12-23
  • 2021-11-13
  • 2021-05-28
  • 2021-09-21
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-08-06
  • 2021-05-28
  • 2022-12-23
  • 2021-07-29
  • 2022-12-23
  • 2021-09-18
相关资源
相似解决方案