我正在学习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);
}
答案 0 :(得分:4)
由于您的值太高,三角形内的任何点都会有一点颜色。每个角都给出一个RGB组件。让我们评估距离红角一小段距离的像素。此像素可能会获得未剪辑的值vec3(253.0f,1.2f,1.9f)。如果我们将此值剪辑到范围0.0f - 1.0f,您将看到它变为vec3(1.0f,1.0f,1.0f)或白色。
边缘不是白色的原因是,这是插值距离足够低的唯一位置,其中0.0f - 255.0f对于其中一个组件不会溢出1.0f。在红点和蓝点之间的任何地方,绿色都很少,它不会溢出1.0,因此我们得到一条紫色线。如果你仔细观察角落,你也会发现这是唯一只有角落颜色的地方(或者至少是其他角落的一小部分)。
三角形上的任何其他地方都会被剪切到vec3(1.0f,1.0f,1.0f),你会得到一个白色的三角形。
编辑:左边三角形没有这些边缘的原因是因为两个RGB组件(vec3(255.0f,255.0f,0.0f),vec3(角色)具有全强度(255.0f) 0.0f,255.0f,255,f)和vec3(255.0f,0.0f,255.0f))。在其中一个边缘上,它在vec3(255.0f,255.0f,0.0f)和vec3(255.0f,0.0f,255.0f)之间进行插值。仅略微远离其中一个角落,唯一的分量为0.0f将向255.0f内插,因为另一个角落将始终具有该特定RGB分量的完全强度。因此,只要您稍微偏离角落,您将获得一个值,例如vec3(255.0f,253.7f,1.3f)。这将剪裁为白色,在这种情况下,边缘也将是白色。如果你提高分辨率,你可能会看到正好在角落处可能有一个像素不是完全白色,但我不确定。
右边的三角形在所有角落的所有RGB分量上都具有完全强度,除了黑色的那个。一旦你稍微偏离黑角,值就会像vec3(1.3f,1.3f,1.3f)那样会剪切成白色,整个三角形会显示为白色。同样,如果你提高分辨率,你可能会在黑角看到一个黑点。