Open_gl 1 种颜色着色器

Open_gl 1 color shaders

本文关键字:颜色 gl Open      更新时间:2023-10-16

我想我的着色器有问题。它应该打印 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);

数组现在是恒定矩形大小的测试版本:

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);
}

顶点着色器。注意"就位"不是纹理的位置!它是屏幕上应该显示制服发送的信件的位置。我不确定我是否可以从顶点数据发送纹理坐标。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> 属类型(0) 这是 glm 库中的功能。有些除以 0。但它可能不相关。

>GL_R不是有效的内部格式,也不是有效的像素传输格式。事实上,如果您一直使用仅内核的 OpenGL 标头,它甚至不会是一个有效的枚举器。即便如此,您也应该检查OpenGL错误,因为这会给您带来错误。

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