MusicSpectrum  1.0.0
Referência da Classe Shader

#include <shader.hpp>

Membros Públicos

 Shader (const std::string &filepath)
 
 ~Shader ()
 
void bind () const
 
void unbind () const
 
void setUniform3f (const std::string &name, glm::vec3 value)
 
void setUniform4f (const std::string &name, glm::vec4 value)
 
void setUniformMat4f (const std::string &name, const glm::mat4 &matrix)
 

Membros Privados

GLuint createShader (const std::string &vertex_shader, const std::string &fragment_shader)
 
ShaderProgramSource parseShader (const std::string &filepath)
 
GLuint compileShader (GLuint type, const std::string &source)
 
GLint getUniformLocation (const std::string &name)
 

Atributos Privados

GLuint m_buffer_id
 
std::unordered_map< std::string, GLint > m_uniformLocationCache
 

Descrição detalhada

Classe auxiliar para gerenciamento de programas de shader.

A classe Shader carrega shaders de arquivos externos (vertex shader e fragment shader), compila o programa e fornece métodos para ativação, desativação e configuração de uniformes.

Construtores e Destrutores

◆ Shader()

Shader::Shader ( const std::string &  filepath)

Construtor da classe Shader.

Carrega os shaders a partir de um arquivo externo especificado pelo caminho do arquivo, compila o programa de shader e inicializa o cache de localização de uniformes.

filepath: Caminho do arquivo contendo os shaders (vertex e fragment).

13  : m_buffer_id(0) {
14  ShaderProgramSource source = parseShader(filepath);
16 }
GLuint createShader(const std::string &vertex_shader, const std::string &fragment_shader)
Definition: shader.cpp:34
ShaderProgramSource parseShader(const std::string &filepath)
Definition: shader.cpp:93
GLuint m_buffer_id
Definition: shader.hpp:35
Definition: shader.hpp:15
std::string fragment_src
Código fonte do fragment shader.
Definition: shader.hpp:20
std::string vertex_src
Código fonte do vertex shader.
Definition: shader.hpp:17

◆ ~Shader()

Shader::~Shader ( )

Destrutor da classe Shader.

Realiza a liberação da memória alocada pelo programa de shader em OpenGL.

23 { glDeleteProgram(m_buffer_id); }

Funções membros

◆ bind()

void Shader::bind ( ) const

Ativa o programa de shader.

Vincula o programa de shader para que ele seja usado para renderização.

126 { glUseProgram(m_buffer_id); }

◆ compileShader()

GLuint Shader::compileShader ( GLuint  type,
const std::string &  source 
)
private

Compila o código fonte de um shader individual.

type: Tipo de shader (GL_VERTEX_SHADER ou GL_FRAGMENT_SHADER).

source: Código fonte do shader.

Returno: Identificador OpenGL do shader compilado.

60  {
61  GLuint id = glCreateShader(type);
62  const char *src = source.c_str();
63  glShaderSource(id, 1, &src, nullptr);
64  glCompileShader(id);
65 
66  int sucess;
67  glGetShaderiv(id, GL_COMPILE_STATUS, &sucess);
68  if (!sucess) {
69  int len;
70  glGetShaderiv(id, GL_INFO_LOG_LENGTH, &len);
71  char *message = (char *)alloca(len * sizeof(char));
72  glGetShaderInfoLog(id, len, &len, message);
73  std::cerr << "Failed compile "
74  << (type == GL_VERTEX_SHADER ? "vertex" : "fragment")
75  << " shader!\n"
76  << message << '\n';
77  glDeleteShader(id);
78  return 0;
79  }
80 
81  return id;
82 }

◆ createShader()

GLuint Shader::createShader ( const std::string &  vertex_shader,
const std::string &  fragment_shader 
)
private

Cria um shader individual (vertex ou fragment) a partir do código fonte.

type: Tipo de shader (GL_VERTEX_SHADER ou GL_FRAGMENT_SHADER).

source: Código fonte do shader.

Retorno: Identificador OpenGL do shader criado.

35  {
36  GLuint program = glCreateProgram();
37  GLuint vs = compileShader(GL_VERTEX_SHADER, vertex_shader);
38  GLuint fs = compileShader(GL_FRAGMENT_SHADER, fragment_shader);
39 
40  glAttachShader(program, vs);
41  glAttachShader(program, fs);
42  glLinkProgram(program);
43  glValidateProgram(program);
44 
45  glDeleteShader(vs);
46  glDeleteShader(fs);
47 
48  return program;
49 }
GLuint compileShader(GLuint type, const std::string &source)
Definition: shader.cpp:60

◆ getUniformLocation()

GLint Shader::getUniformLocation ( const std::string &  name)
private

Obtém a localização de um uniforme no programa de shader.

Essa função verifica se a localização do uniforme já está armazenada no cache m_uniformLocationCache. Se a localização não estiver no cache, ela consulta a OpenGL e armazena o resultado no cache para consultas futuras.

name: Nome do uniforme.

Returno: Localização do uniforme (GLint) ou -1 se o uniforme não for encontrado.

185  {
186  if (m_uniformLocationCache.find(name) != m_uniformLocationCache.end()) {
187  return m_uniformLocationCache[name];
188  }
189 
190  GLint location = glGetUniformLocation(m_buffer_id, name.c_str());
191  if (location == -1) {
192  std::cerr << "Warning: Uniform '" << name << "' doesn't exit!\n";
193  }
194 
195  m_uniformLocationCache[name] = location;
196  return location;
197 }
std::unordered_map< std::string, GLint > m_uniformLocationCache
Definition: shader.hpp:43

◆ parseShader()

ShaderProgramSource Shader::parseShader ( const std::string &  filepath)
private

Carrega e separa o código fonte dos shaders (vertex e fragment) de um arquivo.

filepath: Caminho do arquivo contendo os shaders.

Returno: Estrutura contendo o código fonte separado para vertex shader e fragment shader.

93  {
94  enum class ShaderType {
95  NONE = -1,
96  VERTEX = 0,
97  FRAGMENT = 1,
98  };
99 
100  std::string line;
101  std::ifstream stream(filepath);
102  std::vector<std::stringstream> ss(2);
103  ShaderType type = ShaderType::NONE;
104  while (getline(stream, line)) {
105  if (line.find("#shader") != std::string::npos) {
106  if (line.find("vertex") != std::string::npos) {
107  type = ShaderType::VERTEX;
108  } else if (line.find("fragment") != std::string::npos) {
109  type = ShaderType::FRAGMENT;
110  }
111  } else {
112  ss[static_cast<int>(type)] << line << '\n';
113  }
114  }
115  return {
116  .vertex_src = ss[0].str(),
117  .fragment_src = ss[1].str(),
118  };
119 }

◆ setUniform3f()

void Shader::setUniform3f ( const std::string &  name,
glm::vec3  value 
)

Define um uniforme do tipo vec3 no programa de shader.

name: Nome do uniforme.

value: Valor do uniforme como um vetor glm::vec3.

143  {
144  GLint location = getUniformLocation(name);
145  glUniform3f(location, value.x, value.y, value.z);
146 }
GLint getUniformLocation(const std::string &name)
Definition: shader.cpp:185

◆ setUniform4f()

void Shader::setUniform4f ( const std::string &  name,
glm::vec4  value 
)

Define um uniforme do tipo vec4 no programa de shader.

name: Nome do uniforme.

value: Valor do uniforme como um vetor glm::vec4.

155  {
156  GLint location = getUniformLocation(name);
157  glUniform4f(location, value.x, value.y, value.z, value.w);
158 }

◆ setUniformMat4f()

void Shader::setUniformMat4f ( const std::string &  name,
const glm::mat4 &  matrix 
)

Define um uniforme do tipo mat4 no programa de shader.

name: Nome do uniforme.

matrix: Valor do uniforme como uma matriz glm::mat4.

167  {
168  GLint location = getUniformLocation(name);
169  glUniformMatrix4fv(location, 1, GL_FALSE, &matrix[0][0]);
170 }

◆ unbind()

void Shader::unbind ( ) const

Desativa o programa de shader.

Desvincula o programa de shader, podendo ser útil para evitar interferência com outros programas de shader.

134 { glUseProgram(0); }

Atributos

◆ m_buffer_id

GLuint Shader::m_buffer_id
private

Identificador OpenGL do programa de shader.

◆ m_uniformLocationCache

std::unordered_map<std::string, GLint> Shader::m_uniformLocationCache
private

Cache para localização de uniformes no programa de shader.

Um mapa que armazena o nome do uniforme como chave e sua localização (GLint) como valor. O cache evita consultas repetidas à OpenGL para recuperar a localização de uniformes.


A documentação para essa classe foi gerada a partir dos seguintes arquivos: