我逐渐了解Visual Studio 2017中的OpenGL。 遵循www.learnopengl.com教程并通过了纹理检查点,转换是当前的主要问题。
我使用预先获取的统一位置ID将我的模型,视图和透视图矩阵发送到着色器,但是当将矩阵和vec4(vertex, 1.0f)
向量相乘时,窗口将保持透明色。
如果仅将vec4(vertex, 1.0f)
与模型矩阵相乘,则会绘制对象(cube_flat.obj),但会分散在整个视口中,因为未考虑透视图和视图。哪有错,但是可以。
代码: main.cpp
int main()
{
std::cout << "Application starting...\n" << std::endl;
glm::ivec2 resolution = glm::ivec2(1280, 720);
Window* window = new Window(resolution.x, resolution.y);
SimpleMaterial* simpleMaterial = new SimpleMaterial();
glFrontFace(GL_CCW);
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
glm::mat4 projection = glm::perspective(glm::radians(60.0f), (float)resolution.x / (float)resolution.y, 0.1f, 1000.0f);
glm::mat4 view = glm::inverse(glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -10.0f)));
glm::mat4 model = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f));
Mesh* mesh = Mesh::load("cube_flat.obj");
// Render loop
while (!window->shouldClose())
{
// Input
window->processInput();
// Rendering commands
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Tell OpenGL to use this Shader Program
// Send attribute and uniform data to shader
// Stream vertex, normal and uv data to shader
simpleMaterial->render(projection, view, model, mesh);
// Check & Call events
window->poolEvents();
// Swap buffers
window->swapBuffers();
}
// Delete GLFW data
delete window;
return 0;
}
SimpleMaterial.cpp
SimpleMaterial::SimpleMaterial() : Material("simple")
{
_vertex = _shader->getAttrib("vertex");
_normal = _shader->getAttrib("normal");
_uv = _shader->getAttrib("uv");
_model = _shader->getUniform("model");
_view = _shader->getUniform("view");
_projection = _shader->getUniform("projection");
}
SimpleMaterial::~SimpleMaterial()
{
}
void SimpleMaterial::render(glm::mat4 pProjection, glm::mat4 pView, glm::mat4 pModel, Mesh* pMesh)
{
_shader->use();
glUniformMatrix4fv(_model, 1, GL_FALSE, glm::value_ptr(pModel));
glUniformMatrix4fv(_view, 1, GL_FALSE, glm::value_ptr(pView));
glUniformMatrix4fv(_projection, 1, GL_FALSE, glm::value_ptr(pProjection));
pMesh->draw(_vertex, _normal, _uv);
}
simple.vs
#version 460
in vec3 vertex;
in vec3 normal;
in vec2 uv;
uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;
void main(void) {
gl_Position = projection * view * model * vec4(vertex, 1.0f);
}
simple.fs
#version 460
out vec4 fragment_color;
void main(void) {
fragment_color = vec4(1.0f, 0.0f, 0.0f, 1.0f);
}
由于没有透视图和视图变换,我希望从透视图查看立方体,而不是从视口看到任何东西/立方体。
答案 0 :(得分:2)
视图矩阵的设置为“错误”。视线不通。
glm::mat4 view = glm::inverse(glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -10.0f)));
当然,视图矩阵是该矩阵的逆矩阵,它由视图的位置和方向定义。
视图坐标系描述了从中查看场景的方向和位置。视图矩阵从世界空间转换为视图(眼睛)空间。
但是OpenGL视图空间坐标系是Right-handed系统,其中X轴指向左侧,Y轴指向上方。这会导致Z轴指向视图之外(请注意Z轴是X轴和Y轴的叉积)。
实际上,此行为是由投影矩阵引起的,该投影矩阵定义了视图体积以及从视图空间到剪辑空间(以及进一步规范化的设备空间)的转换。
这意味着视图位置必须为glm::vec3(0.0f, 0.0f, 10.0f)
:
glm::mat4 view = glm::inverse(glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, 10.0f)));