OpenGL 3.3 2D 渲染:VAO 配置不正确
OpenGL 3.3 2D Rendering: VAO not properly configured?
添加VAO后,我似乎无法让这个OpenGL程序渲染四边形。
假设程序正确初始化且没有错误,以下是填充 VAO 的代码。
float quad[] =
{
//verts colors
32.0f, 0.0f, 1.0f, 0.0f, 0.0f, // Top-left
32.0f, 32.0f, 0.0f, 1.0f, 0.0f, // Top-right
0.0f, 32.0f, 0.0f, 0.0f, 1.0f, // Bottom-right
0.0f, 0.0f, 1.0f, 1.0f, 1.0f // Bottom-left
};
float textureCoords[] =
{
0.0f, 0.0f, //x
0.5f, 0.0f, //w
0.5f, 0.5f, //y
0.0f, 0.5f //h
};
float elements[] =
{
0,1,2,
2,3,0
};
//loadShaders compiles and links both shaders
GLuint shaders = loadShaders("vertexShader.c", "fragmentShader.c");
GLuint VAO, VBO[2], EBO;
glGenVertexArrays(1, &VAO);
glGenBuffers(2, VBO);
glGenBuffers(1, &EBO);
//bind VAO
glBindVertexArray(VAO);
glUseProgram(shaders);
//quad and color data
glBindBuffer(GL_ARRAY_BUFFER, VBO[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(quad), quad, GL_STATIC_DRAW);
GLint quadAttrib = glGetAttribLocation(shaders, "quad");
glEnableVertexAttribArray(quadAttrib);//target 'quad' in shader
glVertexAttribPointer(quadAttrib, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), 0);
//color data
GLint colorAttrib = glGetAttribLocation(shaders, "color");
glEnableVertexAttribArray(colorAttrib);//target 'color' in shader
glVertexAttribPointer(colorAttrib, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), (void*)(2 * sizeof(GLfloat)));
//UV data
glBindBuffer(GL_ARRAY_BUFFER, VBO[1]);
glBufferData(GL_ARRAY_BUFFER, sizeof(textureCoords), textureCoords, GL_STATIC_DRAW);
GLint uvAttrib = glGetAttribLocation(shaders, "uvCoords");//target 'uvCoords' in shaders
glEnableVertexAttribArray(uvAttrib);
glVertexAttribPointer(uvAttrib, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(GLfloat), 0);
//TEXTURES
//laod and use textures
GLuint textures[2];
glGenTextures(2, textures);
int texWidth, texHeigth;
unsigned char *image;
//activate texture 0
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textures[0]);
image = SOIL_load_image("atlas.png", &texWidth, &texHeigth, 0, SOIL_LOAD_RGB);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, texWidth, texHeigth, 0, GL_RGB, GL_UNSIGNED_BYTE, image);
SOIL_free_image_data(image);
glUniform1i(glGetUniformLocation(shaders, "img1"), 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
//element buffer data
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(elements), elements, GL_STATIC_DRAW);
//UNIFORMS
//projection matrix
GLint projectionUniform = glGetUniformLocation(shaders, "projection");
glm::mat4 orthoProjection = glm::ortho( 0.0f, static_cast<float>(480), 0.0f, static_cast<float>(272));
glUniformMatrix4fv(projectionUniform, 1, GL_FALSE, glm::value_ptr(orthoProjection));
//model view projection
GLint modelViewUniform = glGetUniformLocation(shaders, "modelView");
//unbind VAO and current shader, the VAO remembers the bound shader
glBindVertexArray(0);
glUseProgram(0);
我假设VAO现在已经跟踪了以下内容:
- 着色器中的四边形缓冲区 'VBO[0]' 及其对应的属性指针 'quadAttrib' 到 "quad">
- 着色器中的颜色缓冲区"相同的 VBO[0]"及其相应的属性指针"colorAttrib"到"color">
- UV 缓冲区 'VBO[1]' 及其对应的属性指针 'uvAttrib' 到 'uvCoords' 在着色器中
- 当前纹理单元 (0( 对应于加载的纹理和绑定到片段着色器中的"img1"及其参数 绑定到
- GL_ELEMENT_ARRAY_BUFFER的EBO
- 投影矩阵及其均匀
- 模型矩阵的处理程序 绑定
- VAO 时正在使用的着色器程序?不确定,我仍然明确使用程序中唯一的着色器程序
稍后在主循环中,如果我尝试执行以下操作,则不会绘制任何内容:
// Clear the screen to black
glClearColor(0.2f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
//draw the quad within this VAO
glBindVertexArray(VAO);
glUseProgram(shaders);
glm::mat4 model;
model = glm::translate(glm::mat4(1.0f), glm::vec3(newTransX, newTransY, newTransZ));
model = glm::scale(model, glm::vec3(newScale));
model = glm::rotate(
model,
(GLfloat)clock() / (GLfloat)CLOCKS_PER_SEC * 10000.0f,
glm::vec3(0.0f, 0.0f, 1.0f)
);
// upload the uniform matrix, modelViewUniform should be already linked to the shader uniform through the VAO
glUniformMatrix4fv(modelViewUniform, 1, GL_FALSE, glm::value_ptr(model));
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
glBindVertexArray(0);
SDL_GL_SwapWindow(window);
顶点着色器:
#version 330
in vec2 quad;
in vec3 color;
in vec2 uvCoords;
out vec3 Color;
out vec2 UVCoords;
uniform mat4 modelView;
uniform mat4 projection;
void main()
{
Color = color;
UVCoords = uvCoords;
gl_Position = projection * modelView * vec4(quad, 0.0f, 1.0f);
}
片段着色器:
#version 330
in vec3 Color;//not in use, simple pipeline test
in vec2 UVCoords;
out vec4 outColor;
uniform sampler2D img1;
void main()
{
vec4 finalTexture = texture(img1, UVCoords);
outColor = finalTexture;
}
我做错了什么?我知道模型视图和投影矩阵中的值是正确的,因为如果我从不使用 VAO,程序就可以工作。
我是否假设VAO记得的比实际记得的多?如果不是,我做错了什么?
这
不可能是对的:
float elements[] =
{
0,1,2,
2,3,0
};
不能对顶点索引使用浮点数。根据您传递给 glDrawElements()
的类型,这应该是:
GLuint elements[] =
{
0,1,2,
2,3,0
};
至于在VAO中跟踪的状态:不,它不会保留所有状态。它仅跟踪顶点属性设置状态。从您的列表中:
着色器中的四边形缓冲区 'VBO[0]' 及其对应的属性指针 'quadAttrib' 到 "quad">
是的。更准确地说,VBO/指针与位置quadAttrib
相关联,并且在VAO中跟踪该关联。您从着色器查询了quadAttrib
,但 VAO 状态不包含与着色器的任何直接关联。
着色器中的颜色缓冲区"相同的 VBO[0]"及其相应的属性指针"colorAttrib"到"color">
这里也一样。
UV 缓冲区 'VBO[1]' 及其对应的属性指针 'uvAttrib' 到 'uvCoords' 在着色器中
而这里。
当前纹理单元 (0( 对应于加载的纹理和绑定到片段着色器中的"img1"及其参数
不。这与顶点属性状态无关。
绑定到GL_ELEMENT_ARRAY_BUFFER的EBO
是的。
投影矩阵及其均匀
不。统一值是程序状态的一部分。
模型矩阵的处理程序
不。
绑定VAO 时正在使用的着色器程序?
不。
相关文章:
- 使用2个键的cpp-stl::优先级队列排序不正确
- 正弦级数方程计算不正确
- 我试图制作一个程序,要求用户输入问题和答案,但程序循环不正确
- 密码登录程序将永远循环并显示不正确的结果
- 更改命令行 qt5 源代码构建配置的正确/快速方法
- 在C++中返回不正确的楼层函数值
- 形状对象的旋转和缩放不正确C++
- C++ 读取文件读取文件不正确
- 关于类的 Python 文档 - 对C++的引用不正确
- 特征 LLT 模块给出不正确的结果?
- glibcxx STL 在实现 std::valarray::sum() 时是否不正确?
- 如果语句逻辑不正确
- 来自逆 vp 矩阵和相机位置的光线方向不正确
- 不正确的操作数类型 MSVC
- 数组填充了不正确的值
- 升级Mac OS,现在Clion不工作,问我配置路径不正确
- 无法加载dll libglorycolx2010.dll.该应用程序未能启动,因为其并排配置不正确.Hresult:0x
- OpenGL 3.3 2D 渲染:VAO 配置不正确
- 由于不正确的清单,并排配置不正确
- libpng 警告:iCCP:已知不正确的 sRGB 配置文件