【发布时间】:2019-12-29 05:25:30
【问题描述】:
我认为我的着色器有问题。它应该打印 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);
}
顶点着色器。注意“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++ opengl glsl glm-math vertex-shader