当由glUniformMatrix4fv创建时,Uniform mat4具有未知值
Uniform mat4 has unknown values when created by glUniformMatrix4fv
我有一个基于OpenGL的非常基本的引擎,可以将任何颜色的多边形渲染到可调整大小的窗口中。我现在正试图通过着色器将模型、透视和视图矩阵作为统一矩阵来实现着色器的矩阵。在添加制服之前,一切都正常工作,我甚至可以在鼠标位置输入一个制服vec2
来模拟光源。均匀的mat4
s不如vec2
s工作。
出于调试目的,我只渲染了一个以屏幕为中心的黄色正方形。如果不穿制服,广场就会如预期的那样出现。我现在尝试传入一个mat4
,设置为单位矩阵。在顶点着色器中,我将gl_Position
乘以统一的单位矩阵。当我运行程序时,它只显示一个黑色窗口。
我尝试在顶点着色器中手动创建一个单位矩阵,并将gl_Position
乘以该矩阵,而不是均匀矩阵。当我这样做的时候,我的黄色方块显示正常。这让我相信统一的mat4
没有得到正确的值,但是,当它在着色器中使用时,我不知道如何检查矩阵的值。
这就是我的顶点着色器的外观:
#version 430 core
layout (location = 0) in vec3 position;
layout (location = 1) in vec4 color;
out vec4 Color;
uniform mat4 model;
uniform mat4 view;
uniform mat4 project;
void main()
{
mat4 id;
id[0] = vec4(1.0, 0.0, 0.0, 0.0);
id[1] = vec4(0.0, 1.0, 0.0, 0.0);
id[2] = vec4(0.0, 0.0, 1.0, 0.0);
id[3] = vec4(0.0, 0.0, 0.0, 1.0);
Color = color;
gl_Position = id * vec4(position, 1.0);
}
mat4 id
是手动创建的单位矩阵,当将id *
更改为model *
时,我会得到黑窗口。
这就是我的碎片着色器的外观:
#version 430 core
in vec4 Color;
out vec4 outColor;
void main()
{
outColor = Color;
}
着色器由以下代码初始化:
m_shaderID = glCreateProgram();
const char* vertexSource = ReadFile::readFile(vertpath);
const char* fragmentSource = ReadFile::readFile(fragpath);
GLint status;
// Vertex Shader
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, &vertexSource, NULL);
glCompileShader(vertexShader);
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &status);
if (status != GL_TRUE)
{
std::cout << "Failed to compile vertex shader!nInfo log: " << std::endl;
char buffer[512];
glGetShaderInfoLog(vertexShader, 512, NULL, buffer);
std::cout << buffer << std::endl;
glDeleteShader(vertexShader);
}
// Fragment Shader
GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &fragmentSource, NULL);
glCompileShader(fragmentShader);
glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &status);
if (status != GL_TRUE)
{
std::cout << "Failed to compile fragment shader!nInfo log: " << std::endl;
char buffer[512];
glGetShaderInfoLog(fragmentShader, 512, NULL, buffer);
std::cout << buffer << std::endl;
glDeleteShader(fragmentShader);
}
// Shader program
glAttachShader(m_shaderID, vertexShader);
glAttachShader(m_shaderID, fragmentShader);
glLinkProgram(m_shaderID);
glValidateProgram(m_shaderID);
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
矩阵由以下代码创建为统一的:
void Shader::setUniformmat4(const GLchar* name, glm::mat4 matrix)
{
for (int i = 0; i <= 3; i++)
printf("%f, %f, %f, %fn", matrix[i].x, matrix[i].y, matrix[i].z, matrix[i].w);
glUniformMatrix4fv(glGetUniformLocation(m_shaderID, name), 1, GL_FALSE, glm::value_ptr(matrix));
}
printf
用于检查矩阵的值,因为它们用于创建统一,并且它们在该点具有单位矩阵的值。
函数setUniformmat4
由以下代码调用:
glm::mat4 model = glm::mat4(1.0);
shader.setUniformmat4("model", model);
当创建照明效果时,我通过调用以下函数创建制服:
void Shader::setUniformvec2(const GLchar* name, glm::vec2 vector)
{
glUniform2f(glGetUniformLocation(m_shaderID, name), vector.x, vector.y);
}
通过这段代码:
shader.setUniformvec2("light_pos", glm::vec2((x / window.getWidth()) * 2.0 - 1.0, 1.0 - 2.0 * (y / window.getHeight())));
其中x
和y
是鼠标坐标。然后我添加行
uniform vec2 light_pos;
到片段着色器。这没问题,而且它可以完美地跟踪鼠标。用于设置统一mat4
的函数看起来与用于设置统一的vec2
的函数相同,只是区别在于mat4
的4fv和vec2
的2f。
正如你所看到的,我对矩阵和向量使用glm。
我的主要功能如下:
Window window(720, 720, "Window");
Shader shader("shader.vert", "shader.frag");
glm::mat4 model = glm::mat4(1.0);
shader.setUniformmat4("model", model);
Renderer* renderer = new Renderer();
std::vector<StaticSprite*> sprites;
sprites.push_back(new StaticSprite(-0.5, -0.5, 0.0, 1.0, 1.0, glm::vec4(1.0, 1.0, 0.0, 1.0), &shader));
while (!window.closed())
{
window.clear();
shader.enable();
double x, y;
window.getMousePosition(x, y);
shader.setUniformvec2("light_pos", glm::vec2((x / window.getWidth()) * 2.0 - 1.0, 1.0 - 2.0 * (y / window.getHeight())));
for (StaticSprite* sprite : sprites)
renderer->submit(sprite);
renderer->flush();
shader.disable();
window.update();
}
return 0;
我总结的问题基本上是,为什么统一mat4的值不正确,有没有办法找出这些值是什么,我应该在代码中更改什么才能使统一mat4工作?
请询问提供答案所需的任何其他信息,我很乐意提供我忘记包含的任何信息。
glUniform
*为当前程序对象指定统一变量的值。这意味着程序必须在之前由glUseProgram
安装
Shader shader("shader.vert", "shader.frag");
shader.enable(); // <--- this is missing
glm::mat4 model = glm::mat4(1.0);
shader.setUniformmat4("model", model);
活动程序资源可以从不是"当前"程序的程序对象(例如glGetUniformLocation
)获得。注意,程序对象是glGetUniformLocation
的一个参数
但是要通过glUniform
*设置uniform的值,程序必须是当前安装的程序。
- 继承期间显示未知行为的子类
- 输入中的字符串数未知(以字母表示)
- 具有未知值时的时间复杂性
- 链表中写入访问冲突的未知原因
- 正在生成未知类实例
- Bjarne Stroustrup Book - std_lib_facilities.h - 不起作用(未知类型名称)
- 读取文件时运行时的未知行为
- 代码在我的计算机上运行良好,但是在将其提交给coursera时遇到未知的信号11问题
- 如何在 glRotatef 中使用 glm::mat4
- 初始化多个未知基类
- 使用 make 编译 MPI,几个命名空间错误,例如"错误:未知类型名称'使用'?
- 如何存储未知次数迭代的输入?
- QtQuick - qml:28:错误:未知方法返回类型:自定义类型
- 编译 Boost 时在 OS X 上的"ld:未知选项:-soname"
- 未知的 CMake 命令"create_single_source_cgal_program"
- 如何在C++中循环访问未知对象方法?
- Coursera :自动评分器的未知信号 11
- 即使直接从官方示例中复制,也找不到未知类型名称QML_ELEMENT和 QML 模块
- 将 glm.mat4 从 Python 传回 C++ (glm::mat4)
- 当由glUniformMatrix4fv创建时,Uniform mat4具有未知值