c++ - Open_gl 1 颜色着色器
问题描述
我想我的着色器有问题。它应该打印 1 种颜色纹理。它不起作用。如果我改为绑定 3 颜色(GL_RGB)纹理,它会像原始图片一样显示它。我像这样绑定纹理:
glTexImage2D(GL_TEXTURE_2D, 0, GL_R, freetype_letters[i]->glyph->bitmap.width, freetype_letters[i]->glyph->bitmap.rows, 0, GL_R, GL_UNSIGNED_BYTE, freetype_letters[i]->glyph->bitmap.buffer);
Array 现在是恒定矩形大小的测试版本:
float letter_quad[]={
0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 0.5f
};
glGenVertexArrays(1, &letter_box_a[i]);
glGenBuffers(1, &letter_box_b[i]);
glBindVertexArray(letter_box_a[i]);
glBindBuffer(GL_ARRAY_BUFFER, letter_box_b[i]);
glBufferData(GL_ARRAY_BUFFER, 4 * 2 * sizeof(float), letter_quad, GL_STATIC_DRAW);
glVertexAttribPointer(0,2,GL_FLOAT, GL_FALSE, 0, (void*)0);
glEnableVertexAttribArray(0);
然后我调用负责选择要绘制的字母并绘制它的函数:
draw_letter(0.0f, 0.0f, 'K', Text_shader, letter_texture, letter_box_a, letter_box_b, glm::vec3(1.0f, 1.0f, 1.0f));
这是声明:
void draw_letter(float PosX, float PosY, unsigned char letter, unsigned int Text_shader, unsigned int *letter_texture, unsigned int *letter_box_a, unsigned int *letter_box_b, glm::vec3 Color){
unsigned int i = (unsigned int)letter;
glBindBuffer(GL_ARRAY_BUFFER, letter_box_b[i]);
glBindTexture(GL_TEXTURE_2D, letter_texture[i]);
glBindVertexArray(letter_box_a[i]);
glUseProgram(Text_shader);
int color_shader = glGetUniformLocation(Text_shader, "InColor");
glUniform3fv(color_shader, 1, glm::value_ptr(Color));
glm::vec2 Position = glm::vec2(PosX, PosY);
int pos_shader = glGetUniformLocation(Text_shader, "InPosition");
glUniform2fv(pos_shader, 1, glm::value_ptr(Position));
glDrawArrays(GL_QUADS,0,4);
}
顶点着色器。注意“InPosition”不是纹理位置!它是屏幕上应该显示从制服发送的字母的位置。我不确定是否可以通过从顶点数据发送纹理坐标来解决问题。Ofc 数组在 x 上为 0.0 - 0.5,在 y 上为 0.0 到 0.5。此测试版本将其缩放 2 应给出纹理坐标 0.0 到 1.0。InPos 改变了 2->3 坐标:
#version 330 core
layout (location=0) in vec3 aPos;
uniform vec3 InColor;
uniform vec2 InPosition;
out vec2 TexCoord;
out vec3 OutColor;
void main(){
TexCoord= vec2(aPos.x*2, aPos.y*2);
gl_Position= vec4(aPos.x + InPosition.x, aPos.y + InPosition.y, 0.0, 1.0);
OutColor= InColor;
}
片段着色器:
#version 330 core
out vec4 FragColor;
in vec2 TexCoord;
in vec3 OutColor;
如果它有帮助,我有时会在控制台中出错:断言失败!func_exponential.inl,第 166 行表达式 x > genType(0) 这是 glm 库中的函数。一些除以0。但它可能不相关。
解决方案
推荐阅读
- flutter - 重置 bloc 中的输入值不会发生
- powershell - powershell CSOM 从 ListItems 获取列表项 ID
- xml - 有没有办法测试和验证同一 XML 文件中标签的内容?
- qt - QSvgRenderer 支持问题
- swiftui - 如果 TextField SwiftUI 中有输入,则启用按钮
- c# - 无法将“System.Collections.Generic.List”类型的对象转换为类型
- node.js - 我正在尝试在 heroku 上部署我的 node.js discord 机器人,但我不断收到错误
- javascript - 为什么 JQuery nearest().remove() 不起作用?
- sed - sed:仅在包含单词 C 的行中,从第 3 行到最后一行将单词 A 替换为 B
- python - 是否有 Python 模拟 matlab 的“save()”函数?