首页 > 解决方案 > 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。但它可能不相关。

标签: c++openglglslglm-mathvertex-shader

解决方案


GL_R不是有效的内部格式,也不是有效的像素传输格式。实际上,如果您一直使用仅核心的 OpenGL 标头,它甚至都不是有效的enumerator。即便如此,您也应该检查您的 OpenGL 错误,因为那会给您一个错误。

您要查找的内部格式是GL_R8,而像素传输格式是GL_RED.


推荐阅读