【发布时间】:2014-09-19 04:04:38
【问题描述】:
我正在学习 OpenGL,我的任务是创建下图:
这就是我的意图,但在我第一次编写它时,我将颜色缓冲为 0 - 255 而不是 0.0 - 1.0 的浮点数。显然这是错误的,但这就是显示的内容:
只显示中心三角形,只有轮廓和颜色是前三个顶点颜色。为什么会这样?当我缓冲不在 [0.0, 1.0] 范围内的颜色时,OpenGL 会做什么?我找不到这方面的文档。
我的着色器如下:
顶点:
layout (location = 0) in vec3 Position;
layout (location = 2) in vec4 vertexColor;
out vec4 vertexColor0;
void main() {
gl_Position = vec4(Position, 1.0f);
vertexColor0 = vertexColor;
}
片段:
in vec4 vertexColor0;
void main() {
gl_FragColor = vertexColor0;
}
这是我用来缓冲数据和绘制数据的代码:
static const int npoints = 9;
static const glm::vec3 points[npoints] = {
glm::vec3(-0.5, 0.5, 0.0),
glm::vec3(-0.7, 0.0, 0.0),
glm::vec3(-0.3, 0.0, 0.0),
glm::vec3(0.2, 0.0, 0.0),
glm::vec3(-0.2, 0.0, 0.0),
glm::vec3(0.0, -0.5, 0.0),
glm::vec3(0.5, 0.5, 0.0),
glm::vec3(0.3, 0.0, 0.0),
glm::vec3(0.7, 0.0, 0.0)
};
//the incorrect version, in the correct version 255 is replaced with 1.0f and 127 with 0.5f
static const glm::vec4 colors[npoints] = {
glm::vec4(0, 255, 255, 255),
glm::vec4(255, 0, 255, 255),
glm::vec4(255, 255, 0, 255),
glm::vec4(255, 0, 0, 255),
glm::vec4(0, 255, 0, 255),
glm::vec4(0, 0, 255, 255),
glm::vec4(0, 0, 0, 255),
glm::vec4(255, 255, 255, 255),
glm::vec4(127, 127, 127, 255)
};
//Create the VAO and the buffer data
void Figure::initialize() {
glUseProgram(shaderProgram); //shaderProgram is a member set to the built shader above
glGenVertexArrays(1, &vertexArrayObject); //vertexArrayObject is also a member
glBindVertexArray(vertexArrayObject);
GLuint VBO;
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER,
npoints * sizeof(glm::vec3),
points,
GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(0);
GLuint CBO;
glGenBuffers(1, &CBO);
glBindBuffer(GL_ARRAY_BUFFER, CBO);
glBufferData(GL_ARRAY_BUFFER,
npoints * sizeof(glm::vec4),
colors,
GL_STATIC_DRAW);
glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(2);
}
//draw the figure
void Figure::draw() {
glUseProgram(shaderProgram);
glBindVertexArray(vertexArrayObject);
glDrawArrays(GL_TRIANGLES, 0, npoints);
}
【问题讨论】:
-
你可能使用 glColor3ub 并且实际上使用了无符号字节。
-
很可能是溢出了。由于您使用的是整数,因此每次都会溢出到相同的值
-
@Basic 怎么会溢出? 255 可以表示为浮点数。在乘以 255 后,他们必须在某个点将其转换为无符号字节。我真的不明白这种转换如何导致溢出,通常只是将 mod 转换为目标的最大大小。一些文档说 floats > 1.0f 会导致未定义的行为,否则会很好。
-
@Fsmv 我在考虑整数,它占用了最低有效的 8 位。你说得对,这不适用于浮动。