GearEngine  0.0.1
Gear::OpenGLShader 클래스 참조

#include <OpenGLShader.h>

Gear::OpenGLShader에 대한 상속 다이어그램 :
Inheritance graph
Gear::OpenGLShader에 대한 협력 다이어그램:
Collaboration graph

Public 멤버 함수

 OpenGLShader (const std::string &filepath)
 
 OpenGLShader (const std::string &name, const std::string &vertexSrc, const std::string &fragmentSrc)
 
virtual ~OpenGLShader ()
 
virtual void Bind () const
 
virtual void Unbind () const
 
virtual void SetInt (const std::string &name, int value) override
 
virtual void SetFloat (const std::string &name, float value) override
 
virtual void SetFloat3 (const std::string &name, const glm::vec3 &value) override
 
virtual void SetFloat4 (const std::string &name, const glm::vec4 &value) override
 
virtual void SetMat4 (const std::string &name, const glm::mat4 &value) override
 
virtual const std::string & GetName () const
 
void UploadUniformInt (const std::string &name, int value)
 
void UploadUniformFloat (const std::string &name, float value)
 
void UploadUniformFloat2 (const std::string &name, const glm::vec2 &value)
 
void UploadUniformFloat3 (const std::string &name, const glm::vec3 &value)
 
void UploadUniformFloat4 (const std::string &name, const glm::vec4 &value)
 
void UploadUniformMat3 (const std::string &name, const glm::mat3 &matrix)
 
void UploadUniformMat4 (const std::string &name, const glm::mat4 &matrix)
 

정적 Public 멤버 함수

static Ref< ShaderCreate (const std::string &filepath)
 
static Ref< ShaderCreate (const std::string &name, const std::string &vertexSrc, const std::string &fragmentSrc)
 

Private 멤버 함수

std::string ReadFile (const std::string &filepath)
 
std::unordered_map< GLenum, std::string > PreProcess (const std::string &source)
 
void Compile (const std::unordered_map< GLenum, std::string > &shaderSources)
 

Private 속성

uint32_t m_RendererID
 
std::string m_Name
 

상세한 설명

OpenGLShader.h 파일의 11 번째 라인에서 정의되었습니다.

생성자 & 소멸자 문서화

◆ OpenGLShader() [1/2]

Gear::OpenGLShader::OpenGLShader ( const std::string &  filepath)

OpenGLShader.cpp 파일의 22 번째 라인에서 정의되었습니다.

23  {
25 
26  std::string source = ReadFile(filepath);
27  auto shaderSources = PreProcess(source);
28  Compile(shaderSources);
29 
30  //Extract name form filepath
31  auto lastSlash = filepath.find_last_of("/\\");
32  lastSlash = lastSlash == std::string::npos ? 0 : lastSlash + 1;
33  auto lastDot = filepath.rfind('.');
34  auto count = lastDot == std::string::npos ? filepath.size() - lastSlash : lastDot - lastSlash;
35  m_Name = filepath.substr(lastSlash, count);
36  }
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ OpenGLShader() [2/2]

Gear::OpenGLShader::OpenGLShader ( const std::string &  name,
const std::string &  vertexSrc,
const std::string &  fragmentSrc 
)

OpenGLShader.cpp 파일의 38 번째 라인에서 정의되었습니다.

39  : m_Name(name)
40  {
42 
43  std::unordered_map<GLenum, std::string> sources;
44  sources[GL_VERTEX_SHADER] = vertexSrc;
45  sources[GL_FRAGMENT_SHADER] = fragmentSrc;
46  Compile(sources);
47  }
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ ~OpenGLShader()

Gear::OpenGLShader::~OpenGLShader ( )
virtual

OpenGLShader.cpp 파일의 173 번째 라인에서 정의되었습니다.

174  {
176 
177  glDeleteProgram(m_RendererID);
178  }

멤버 함수 문서화

◆ Bind()

void Gear::OpenGLShader::Bind ( ) const
virtual

Gear::Shader를 구현.

OpenGLShader.cpp 파일의 179 번째 라인에서 정의되었습니다.

180  {
182 
183  glUseProgram(m_RendererID);
184  }

◆ Compile()

void Gear::OpenGLShader::Compile ( const std::unordered_map< GLenum, std::string > &  shaderSources)
private

OpenGLShader.cpp 파일의 96 번째 라인에서 정의되었습니다.

97  {
99 
100  GLint program = glCreateProgram();
101  GR_CORE_ASSERT(shaderSources.size() <= 2, "We Only suprrot 2 shaders for now");
102  std::array<GLenum, 2> glShaderIDs;
103  int glShaderIDIndex = 0;
104  for (auto& kv : shaderSources)
105  {
106  GLenum type = kv.first;
107  const std::string& source = kv.second;
108 
109  GLuint shader = glCreateShader(type);
110 
111  const GLchar *sourceCstr = source.c_str();
112  glShaderSource(shader, 1, &sourceCstr, 0);
113 
114  // Compile the vertex shader
115  glCompileShader(shader);
116 
117  GLint isCompiled = 0;
118  glGetShaderiv(shader, GL_COMPILE_STATUS, &isCompiled);
119  if (isCompiled == GL_FALSE)
120  {
121  GLint maxLength = 0;
122  glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &maxLength);
123 
124  std::vector<GLchar> infoLog(maxLength);
125  glGetShaderInfoLog(shader, maxLength, &maxLength, &infoLog[0]);
126 
127  glDeleteShader(shader);
128 
129  GR_CORE_ERROR({ 0 }, infoLog.data());
130  GR_CORE_ASSERT(false, "Shader compilation failure");
131  break;
132  }
133  glAttachShader(program, shader);
134  glShaderIDs[glShaderIDIndex++] = shader;
135  }
136 
137  m_RendererID = program;
138 
139  // Link our program
140  glLinkProgram(program);
141 
142  // Note the different functions here: glGetProgram* instead of glGetShader*.
143  GLint isLinked = 0;
144  glGetProgramiv(program, GL_LINK_STATUS, (int *)&isLinked);
145  if (isLinked == GL_FALSE)
146  {
147  GLint maxLength = 0;
148  glGetProgramiv(program, GL_INFO_LOG_LENGTH, &maxLength);
149 
150  // The maxLength includes the NULL character
151  std::vector<GLchar> infoLog(maxLength);
152  glGetProgramInfoLog(program, maxLength, &maxLength, &infoLog[0]);
153 
154  // We don't need the program anymore.
155  glDeleteProgram(program);
156 
157  for (auto id : glShaderIDs)
158  glDeleteShader(id);
159 
160  GR_CORE_ERROR({ 0 }, infoLog.data());
161  GR_CORE_ASSERT(false, "Shader link failure");
162  return;
163  }
164 
165  // Always detach shaders after a successful link.
166  for (auto id : glShaderIDs)
167  {
168  glDetachShader(program, id);
169  glDeleteShader(id);
170  }
171  }
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ Create() [1/2]

Ref< Shader > Gear::Shader::Create ( const std::string &  filepath)
staticinherited

Shader.cpp 파일의 9 번째 라인에서 정의되었습니다.

10  {
11  switch (Renderer::GetAPI())
12  {
14  GR_CORE_ASSERT(false, "RendererAPI::None is currently not supported!");
15  return nullptr;
17  return std::make_shared<OpenGLShader>(filepath);
18  }
19  GR_CORE_ASSERT(false, "Unknown RendererAPI!");
20  return nullptr;
21  }
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ Create() [2/2]

Ref< Shader > Gear::Shader::Create ( const std::string &  name,
const std::string &  vertexSrc,
const std::string &  fragmentSrc 
)
staticinherited

Shader.cpp 파일의 23 번째 라인에서 정의되었습니다.

24  {
25  switch (Renderer::GetAPI())
26  {
28  GR_CORE_ASSERT(false, "RendererAPI::None is currently not supported!");
29  return nullptr;
31  return std::make_shared<OpenGLShader>(name, vertexSrc, fragmentSrc);
32  }
33  GR_CORE_ASSERT(false, "Unknown RendererAPI!");
34  return nullptr;
35  }
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ GetName()

virtual const std::string& Gear::OpenGLShader::GetName ( ) const
inlinevirtual

Gear::Shader를 구현.

OpenGLShader.h 파일의 27 번째 라인에서 정의되었습니다.

27 { return m_Name; };

◆ PreProcess()

std::unordered_map< GLenum, std::string > Gear::OpenGLShader::PreProcess ( const std::string &  source)
private

OpenGLShader.cpp 파일의 70 번째 라인에서 정의되었습니다.

71  {
73 
74  std::unordered_map<GLenum, std::string> shaderSources;
75 
76  const char* typeToken = "#type";
77  size_t typeTokenLength = strlen(typeToken);
78  size_t pos = source.find(typeToken, 0);
79  while (pos != std::string::npos)
80  {
81  size_t eol = source.find_first_of("\r\n", pos);
82  GR_CORE_ASSERT(eol != std::string::npos, "Syntax error");
83  size_t begin = pos + typeTokenLength + 1;
84  std::string type = source.substr(begin, eol - begin);
85  GR_CORE_ASSERT(ShaderTypeFromString(type), "Invalid shader type spcific");
86 
87  size_t nextLinePos = source.find_first_not_of("\r\n", eol);
88  pos = source.find(typeToken, nextLinePos);
89  shaderSources[ShaderTypeFromString(type)] = source.substr(nextLinePos,
90  pos - (nextLinePos == std::string::npos ? source.size() - 1 : nextLinePos));
91  }
92 
93  return shaderSources;
94  }
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ ReadFile()

std::string Gear::OpenGLShader::ReadFile ( const std::string &  filepath)
private

OpenGLShader.cpp 파일의 49 번째 라인에서 정의되었습니다.

50  {
52 
53  std::string result;
54  std::ifstream in(filepath, std::ios::in | std::ios::binary);
55  if (in)
56  {
57  in.seekg(0, std::ios::end);
58  result.resize(in.tellg());
59  in.seekg(0, std::ios::beg);
60  in.read(&result[0], result.size());
61  in.close();
62  }
63  else
64  {
65  GR_CORE_ERROR("Could not open file {0}", filepath);
66  }
67  return result;
68  }
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ SetFloat()

void Gear::OpenGLShader::SetFloat ( const std::string &  name,
float  value 
)
overridevirtual

Gear::Shader를 구현.

OpenGLShader.cpp 파일의 199 번째 라인에서 정의되었습니다.

200  {
202 
203  UploadUniformFloat(name, value);
204  }
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ SetFloat3()

void Gear::OpenGLShader::SetFloat3 ( const std::string &  name,
const glm::vec3 &  value 
)
overridevirtual

Gear::Shader를 구현.

OpenGLShader.cpp 파일의 206 번째 라인에서 정의되었습니다.

207  {
209 
210  UploadUniformFloat3(name, value);
211  }
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ SetFloat4()

void Gear::OpenGLShader::SetFloat4 ( const std::string &  name,
const glm::vec4 &  value 
)
overridevirtual

Gear::Shader를 구현.

OpenGLShader.cpp 파일의 212 번째 라인에서 정의되었습니다.

213  {
215 
216  UploadUniformFloat4(name, value);
217  }
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ SetInt()

void Gear::OpenGLShader::SetInt ( const std::string &  name,
int  value 
)
overridevirtual

Gear::Shader를 구현.

OpenGLShader.cpp 파일의 192 번째 라인에서 정의되었습니다.

193  {
195 
196  UploadUniformInt(name, value);
197  }
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ SetMat4()

void Gear::OpenGLShader::SetMat4 ( const std::string &  name,
const glm::mat4 &  value 
)
overridevirtual

Gear::Shader를 구현.

OpenGLShader.cpp 파일의 218 번째 라인에서 정의되었습니다.

219  {
221 
222  UploadUniformMat4(name, value);
223  }
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ Unbind()

void Gear::OpenGLShader::Unbind ( ) const
virtual

Gear::Shader를 구현.

OpenGLShader.cpp 파일의 185 번째 라인에서 정의되었습니다.

186  {
188 
189  glUseProgram(0);
190  }

◆ UploadUniformFloat()

void Gear::OpenGLShader::UploadUniformFloat ( const std::string &  name,
float  value 
)

OpenGLShader.cpp 파일의 231 번째 라인에서 정의되었습니다.

232  {
233  GLint location = glGetUniformLocation(m_RendererID, name.c_str());
234  glUniform1f(location, value);
235  }
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ UploadUniformFloat2()

void Gear::OpenGLShader::UploadUniformFloat2 ( const std::string &  name,
const glm::vec2 &  value 
)

OpenGLShader.cpp 파일의 237 번째 라인에서 정의되었습니다.

238  {
239  GLint location = glGetUniformLocation(m_RendererID, name.c_str());
240  glUniform2f(location, value.x, value.y);
241  }

◆ UploadUniformFloat3()

void Gear::OpenGLShader::UploadUniformFloat3 ( const std::string &  name,
const glm::vec3 &  value 
)

OpenGLShader.cpp 파일의 243 번째 라인에서 정의되었습니다.

244  {
245  GLint location = glGetUniformLocation(m_RendererID, name.c_str());
246  glUniform3f(location, value.x, value.y, value.z);
247  }
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ UploadUniformFloat4()

void Gear::OpenGLShader::UploadUniformFloat4 ( const std::string &  name,
const glm::vec4 &  value 
)

OpenGLShader.cpp 파일의 249 번째 라인에서 정의되었습니다.

250  {
251  GLint location = glGetUniformLocation(m_RendererID, name.c_str());
252  glUniform4f(location, value.x, value.y, value.z, value.w);
253  }
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ UploadUniformInt()

void Gear::OpenGLShader::UploadUniformInt ( const std::string &  name,
int  value 
)

OpenGLShader.cpp 파일의 225 번째 라인에서 정의되었습니다.

226  {
227  GLint location = glGetUniformLocation(m_RendererID, name.c_str());
228  glUniform1i(location, value);
229  }
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ UploadUniformMat3()

void Gear::OpenGLShader::UploadUniformMat3 ( const std::string &  name,
const glm::mat3 &  matrix 
)

OpenGLShader.cpp 파일의 255 번째 라인에서 정의되었습니다.

256  {
257  GLint location = glGetUniformLocation(m_RendererID, name.c_str());
258  glUniformMatrix3fv(location, 1, GL_FALSE, glm::value_ptr(matrix));
259  }

◆ UploadUniformMat4()

void Gear::OpenGLShader::UploadUniformMat4 ( const std::string &  name,
const glm::mat4 &  matrix 
)

OpenGLShader.cpp 파일의 261 번째 라인에서 정의되었습니다.

262  {
263  GLint location = glGetUniformLocation(m_RendererID, name.c_str());
264  glUniformMatrix4fv(location, 1, GL_FALSE, glm::value_ptr(matrix));
265  }
이 함수를 호출하는 함수들에 대한 그래프입니다.:

멤버 데이터 문서화

◆ m_Name

std::string Gear::OpenGLShader::m_Name
private

OpenGLShader.h 파일의 44 번째 라인에서 정의되었습니다.

◆ m_RendererID

uint32_t Gear::OpenGLShader::m_RendererID
private

OpenGLShader.h 파일의 43 번째 라인에서 정의되었습니다.


이 클래스에 대한 문서화 페이지는 다음의 파일들로부터 생성되었습니다.:
Gear::OpenGLShader::m_RendererID
uint32_t m_RendererID
Definition: OpenGLShader.h:43
Gear::OpenGLShader::UploadUniformFloat
void UploadUniformFloat(const std::string &name, float value)
Definition: OpenGLShader.cpp:231
Gear::OpenGLShader::UploadUniformMat4
void UploadUniformMat4(const std::string &name, const glm::mat4 &matrix)
Definition: OpenGLShader.cpp:261
GR_CORE_ERROR
#define GR_CORE_ERROR(...)
Definition: Log.h:29
Gear::OpenGLShader::UploadUniformFloat4
void UploadUniformFloat4(const std::string &name, const glm::vec4 &value)
Definition: OpenGLShader.cpp:249
GR_PROFILE_FUNCTION
#define GR_PROFILE_FUNCTION()
Definition: Instrumentor.h:131
Gear::RendererAPI::API::None
@ None
Gear::OpenGLShader::Compile
void Compile(const std::unordered_map< GLenum, std::string > &shaderSources)
Definition: OpenGLShader.cpp:96
Gear::RendererAPI::API::OpenGL
@ OpenGL
Gear::Renderer::GetAPI
static RendererAPI::API GetAPI()
Definition: Renderer.h:23
Gear::ShaderTypeFromString
static GLenum ShaderTypeFromString(const std::string &type)
Definition: OpenGLShader.cpp:11
Gear::OpenGLShader::UploadUniformFloat3
void UploadUniformFloat3(const std::string &name, const glm::vec3 &value)
Definition: OpenGLShader.cpp:243
GR_CORE_ASSERT
#define GR_CORE_ASSERT(x,...)
Definition: Core.h:68
Gear::OpenGLShader::m_Name
std::string m_Name
Definition: OpenGLShader.h:44
GLenum
unsigned int GLenum
Definition: OpenGLShader.h:7
Gear::OpenGLShader::UploadUniformInt
void UploadUniformInt(const std::string &name, int value)
Definition: OpenGLShader.cpp:225
Gear::OpenGLShader::PreProcess
std::unordered_map< GLenum, std::string > PreProcess(const std::string &source)
Definition: OpenGLShader.cpp:70
Gear::OpenGLShader::ReadFile
std::string ReadFile(const std::string &filepath)
Definition: OpenGLShader.cpp:49