
Pipeline.Cpp
#include "pipeline.h"
const Matrix4f& Pipeline::GetWorldTrans()
{
Matrix4f ScaleTrans, RotateTrans, TranslationTrans;
ScaleTrans.InitScaleTransform(m_scale.x, m_scale.y, m_scale.z);
RotateTrans.InitRotateTransform(m_rotateInfo.x, m_rotateInfo.y, m_rotateInfo.z);
TranslationTrans.InitTranslationTransform(m_worldPos.x, m_worldPos.y, m_worldPos.z);
m_WorldTransformation = TranslationTrans * RotateTrans * ScaleTrans;
return m_WorldTransformation;
}
const Matrix4f& Pipeline::GetWVPTrans()
{
GetWorldTrans();
Matrix4f CameraTranslationTrans, CameraRotateTrans, PersProjTrans;
CameraTranslationTrans.InitTranslationTransform(-m_camera.Pos.x, -m_camera.Pos.y, -m_camera.Pos.z);
CameraRotateTrans.InitCameraTransform(m_camera.Target, m_camera.Up);
PersProjTrans.InitPersProjTransform(m_persProj.FOV, m_persProj.Width, m_persProj.Height, m_persProj.zNear, m_persProj.zFar);
m_WVPtransformation = PersProjTrans * CameraRotateTrans * CameraTranslationTrans * m_WorldTransformation;
return m_WVPtransformation;
}
Technique.Cpp
#include <stdio.h>
#include <string.h>
#include "technique.h"
Technique::Technique() {
m_shaderProg = 0;
}
Technique::~Technique() {
for (ShaderObjList::iterator it = m_shaderObjList.begin(); it != m_shaderObjList.end(); it++) {
glDeleteShader(*it);
}
if (m_shaderProg != 0) {
glDeleteProgram(m_shaderProg);
m_shaderProg = 0;
}
}
bool Technique::Init() {
m_shaderProg = glCreateProgram();
if (m_shaderProg == 0) {
fprintf(stderr, "Error creating shader program\n");
return false;
}
return true;
}
//Используем этот метод для добавления шейдеров в программу. Когда заканчиваем - вызываем finalize()
bool Technique::AddShader(GLenum ShaderType, const char* pShaderText) {
GLuint ShaderObj = glCreateShader(ShaderType);
if (ShaderObj == 0) {
fprintf(stderr, "Error creating shader type %d\n", ShaderType);
return false;
}
// Сохраним объект шейдера - он будет удален в декструкторе
m_shaderObjList.push_back(ShaderObj);
const GLchar* p[1];
p[0] = pShaderText;
GLint Lengths[1];
Lengths[0] = strlen(pShaderText);
glShaderSource(ShaderObj, 1, p, Lengths);
glCompileShader(ShaderObj);
GLint success;
glGetShaderiv(ShaderObj, GL_COMPILE_STATUS, &success);
if (!success) {
GLchar InfoLog[1024];
glGetShaderInfoLog(ShaderObj, 1024, NULL, InfoLog);
fprintf(stderr, "Error compiling shader type %d: '%s'\n", ShaderType, InfoLog);
return false;
}
glAttachShader(m_shaderProg, ShaderObj);
return true;
}
// После добавления всех шейдеров в программу вызываем эту функцию
// для линковки и проверки программу на ошибки
bool Technique::Finalize() {
GLint Success = 0;
GLchar ErrorLog[1024] = { 0 };
glLinkProgram(m_shaderProg);
glGetProgramiv(m_shaderProg, GL_LINK_STATUS, &Success);
if (Success == 0) {
glGetProgramInfoLog(m_shaderProg, sizeof(ErrorLog), NULL, ErrorLog);
fprintf(stderr, "Error linking shader program: '%s'\n", ErrorLog);
return false;
}
glValidateProgram(m_shaderProg);
glGetProgramiv(m_shaderProg, GL_VALIDATE_STATUS, &Success);
if (Success == 0) {
glGetProgramInfoLog(m_shaderProg, sizeof(ErrorLog), NULL, ErrorLog);
fprintf(stderr, "Invalid shader program: '%s'\n", ErrorLog);
return false;
}
// Удаляем промежуточные объекты шейдеров, которые были добавлены в программу
for (ShaderObjList::iterator it = m_shaderObjList.begin(); it != m_shaderObjList.end(); it++) {
glDeleteShader(*it);
}
m_shaderObjList.clear();
return true;
}
void Technique::Enable() {
glUseProgram(m_shaderProg);
}
GLint Technique::GetUniformLocation(const char* pUniformName) {
GLint Location = glGetUniformLocation(m_shaderProg, pUniformName);
if (Location == 0xFFFFFFFF) {
fprintf(stderr, "Warning! Unable to get the location of uniform '%s'\n", pUniformName);
}
return Location;
}