Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
PRO-232B_Ikhsanova_Elina_LR3.docx
Скачиваний:
0
Добавлен:
07.04.2025
Размер:
1.03 Mб
Скачать

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;

}

Соседние файлы в предмете Инженерная и компьютерная графика