Opengl 为什么矩形有两种不同的色调
我正在画一个基本矩形Opengl 为什么矩形有两种不同的色调,opengl,glsl,Opengl,Glsl,我正在画一个基本矩形 void renderQuad() { if (quadVAO == 0) { float quadVertices[] = { // vertex attributes for a quad that fills the entire screen in Normalized Device Coordinates. // positions // texCoords -1.0f, 1.0f, 0.0f
void renderQuad()
{
if (quadVAO == 0)
{
float quadVertices[] = { // vertex attributes for a quad that fills the entire screen in Normalized Device Coordinates.
// positions // texCoords
-1.0f, 1.0f, 0.0f, 1.0f,
-1.0f, -1.0f, 0.0f, 0.0f,
1.0f, -1.0f, 1.0f, 0.0f,
-1.0f, 1.0f, 0.0f, 1.0f,
1.0f, -1.0f, 1.0f, 0.0f,
1.0f, 1.0f, 1.0f, 1.0f
};
// VAO
glGenVertexArrays(1, &quadVAO);
glGenBuffers(1, &quadVBO);
glBindVertexArray(quadVAO);
glBindBuffer(GL_ARRAY_BUFFER, quadVBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(quadVertices), &quadVertices, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)(2 * sizeof(float)));
}
glBindVertexArray(quadVAO);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 6);
glBindVertexArray(0);
}
void RenderThread()
{
Shader shader("C:\\Shaders\\Screen\\Vert.txt", "C:\\Shaders\\Screen\\Frag.txt");
glDisable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
shader.use();
while (!glfwWindowShouldClose(window))
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT );
processInput(window);
renderQuad();
glfwSwapBuffers(window);
glfwPollEvents();
}
}
这是我正在绘制矩形的渲染函数
void renderQuad()
{
if (quadVAO == 0)
{
float quadVertices[] = { // vertex attributes for a quad that fills the entire screen in Normalized Device Coordinates.
// positions // texCoords
-1.0f, 1.0f, 0.0f, 1.0f,
-1.0f, -1.0f, 0.0f, 0.0f,
1.0f, -1.0f, 1.0f, 0.0f,
-1.0f, 1.0f, 0.0f, 1.0f,
1.0f, -1.0f, 1.0f, 0.0f,
1.0f, 1.0f, 1.0f, 1.0f
};
// VAO
glGenVertexArrays(1, &quadVAO);
glGenBuffers(1, &quadVBO);
glBindVertexArray(quadVAO);
glBindBuffer(GL_ARRAY_BUFFER, quadVBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(quadVertices), &quadVertices, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)(2 * sizeof(float)));
}
glBindVertexArray(quadVAO);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 6);
glBindVertexArray(0);
}
void RenderThread()
{
Shader shader("C:\\Shaders\\Screen\\Vert.txt", "C:\\Shaders\\Screen\\Frag.txt");
glDisable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
shader.use();
while (!glfwWindowShouldClose(window))
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT );
processInput(window);
renderQuad();
glfwSwapBuffers(window);
glfwPollEvents();
}
}
这些是着色器
顶点着色器
#version 330 core
layout( location = 0 ) in vec2 aPos;
layout( location = 1) in vec2 aTexCoord;
out vec2 TexCoord;
void main()
{
TexCoord = aTexCoord;
gl_Position = vec4( aPos , 0.0 , 1.0 );
}
片段着色器
#version 330 core
in vec2 TexCoord;
out vec4 OutColor;
void main()
{
OutColor = vec4( 0.5 , 0.0 , 0.0 , 0.3);
}
矩形用两种不同的色调绘制
如果我删除这行“glBlendFunc(GL_SRC_ALPHA,GL_ONE_减去_SRC_ALPHA)”,它就会正确绘制。因为您使用了错误的基元类型。如果要绘制2个三角形基本体(6个坐标),则必须使用
GL_三角形
:
gldrawArray(GL_三角形_带,0,6)代码>
gldrawArray(GL_三角形,0,6);
对于由一个GL\u TRIANGLE\u STRIP
构成的2个三角形,4个坐标足够:
float四边形顶点[]={
//位置//texCoords
-1.0f,1.0f,0.0f,1.0f,
-1.0f,-1.0f,0.0f,0.0f,
1.0f,1.0f,1.0f,1.0f,
1.0f,-1.0f,1.0f,0.0f,
};
gldrawArray(GL_三角形_带,0,4);