- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
添加 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 现在已经跟踪了以下内容:
稍后在主循环中,如果我尝试以下操作,则不会绘制任何内容:
// 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;
}
我做错了什么?我知道 modelView 和投影矩阵中的值是正确的,因为如果我从不使用 VAO,程序就可以运行。
我是否假设 VAO 记住的比实际记住的多?如果不是,我做错了什么?
最佳答案
这不可能是对的:
float elements[] =
{
0,1,2,
2,3,0
};
您不能将 float 用作顶点索引。根据您传递给 glDrawElements()
的类型,这应该是:
GLuint elements[] =
{
0,1,2,
2,3,0
};
至于在 VAO 中跟踪的状态:不,它不会保留所有状态。它只跟踪顶点属性设置状态。从您的列表中:
The quad buffer 'VBO[0]' and its corresponding attribPointer 'quadAttrib' to "quad" in the shader
是的。更准确地说,VBO/指针与位置 quadAttrib
相关联,并且在 VAO 中跟踪该关联。您从着色器中查询了 quadAttrib
,但 VAO 状态不包含与着色器的任何直接关联。
The color buffer 'same VBO[0]' and its corresponding attribPointer 'colorAttrib' to 'color' in shader
这里也一样。
The UV buffer 'VBO[1]' and its corresponding attribPointer 'uvAttrib' to 'uvCoords' in shader
还有这里。
That the current texture unit (0) corresponds to the loaded texture and the bind to "img1" in the fragment shader as well as its parameters
没有。这与顶点属性状态无关。
The EBO that is bounded to GL_ELEMENT_ARRAY_BUFFER
是的。
The projection matrix and its uniform
没有。统一值是程序状态的一部分。
The handler to the model matrix
没有。
The shader program that was in use while the VAO was bound?
没有。
关于c++ - OpenGL 3.3 2D 渲染 : VAO not properly configured?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27415772/
我遇到了一个恐怕很难解决的问题,至少就谷歌搜索而言是这样。 我有一个使用 Qt 的编辑器实用程序,它为编辑器中的不同工具创建多个 OpenGL 上下文,它们是一个“世界”编辑器,它托管我的游戏场景的
我正在再次尝试 OpenGL,我想知道如何设计稍后呈现的类。现在,只有一种类型的形状,所以我创建了一个 Shape 类,它有一个静态 VAO 成员,当第一个时调用 glGenVertexArrays(
环境:OpenGL 3.3+、C 编程、Windows。 我有一个函数,可以从模型加载所有顶点数据,但只返回 VAO id 和顶点数。在此过程中,它生成 VBO id,并将顶点数组数据传递到缓冲区..
假设我有 2 个不同的对象,每个对象都有自己的 VAO 和绘制调用。像这样的事情: void Object::Draw() { glBindVertexArray(vao); glDr
1 VAO 是 OpenGL 技术中提出来的 参考: 外链 其中有一段文字记录了 VAO 是什么: A Vertex Array Object (VAO) is an object which con
我最近使用顶点数组对象 (VAO) 编写了一些 OpenGL 3.3 代码,后来在英特尔图形适配器上对其进行了测试,令我失望的是,元素数组缓冲区绑定(bind)显然不是 VAO 状态的一部分,因为调用
我正在使用 OpenGL 编写一个小图形引擎(通过 OpenTK 和 C#)。 为了定义顶点属性,我有一个 VertexDeclaration 类,其中包含一组 VertexElement 结构,这些
我面临一个问题,我认为该问题与 VAO 相关,但我不确定.. 我不确定 VAO 的正确用法,我在 GL 初始化期间所做的很简单 glGenVertexArrays(1,&vao) 后跟 glBindV
假设我们将两个程序上的顶点属性位置绑定(bind)到相同的值。使用相同的顶点数组对象来使用这两个程序进行绘制是否正确? 最佳答案 定义“正确”。 如果两个程序对象使用兼容的属性位置,则它们使用相同的属
我一直在阅读一些有关 VAO 如何与 VBO 配合使用的内容。据我了解,当我们调用 glVertexAttribPointer 时,VAO 仅存储有关 VBO 的状态信息。我的问题是,它何时存储有关
我做了一个加载器类来加载 V.A.Os 纹理等但是当我使用这个方法时 GLuint Loader::loadToVAO(GLfloat* vertices) { GLuint VertexAr
据我所知,顶点获取阶段由 VAO 封装,并且 VAO 需要包含顶点获取阶段状态,以便在缓冲区对象和顶点属性之间进行管道传输以及格式化缓冲区对象中的数据。 我一直在阅读的关于这个主题的两本书,红皮书,蓝
我最近开始学习 OpenGL,我一直在尝试编写一个程序,使用带有着色器的 VAO 和 VBO 在屏幕上显示钻石。我的代码主要基于本教程: https://www.opengl.org/wiki/Tut
我刚刚开始使用 OpenGL,并且我正在尝试仅使用 3.x 及更高版本的功能。我不明白的一件事是 VAO。 我知道 VAO 封装了渲染状态,所以我可以在渲染循环之前调用所有设置函数,然后绑定(bind
VAO 是顶点数组对象,VBO 是顶点缓冲区对象。创建和绑定(bind)/解除绑定(bind) VAO 和 VBO 的调用具有如下一般格式: GLuint VAO, VBO; glGenVertexA
我希望在 Cocoa 上制作一个自定义的 NSOpenGL View 。但是,我在使用 VAO 时遇到了问题。特别是,运行时,这个虚拟测试 View : /// OpenGLTestView.h: @
我和我的 friend 正在开发一个使用 C++ 和 OpenGL 的项目。我们为“ModelObject”创建了一个C++类,每个ModelObject都有一个GLuint vao作为成员变量。然后
我很难理解 VAO 到底是如何处理缓冲区映射的。我正在做的事情可以用这个伪代码来描述: SetUp: BindVAO BindArrayBuffer glBufferData(GL_ARR
我想知道如果我想画画最好做什么超过约 6000 个不同的 VAO 使用相同的着色器。 目前,我绑定(bind)我的着色器,然后为其提供所需的所有信息(统一),然后循环遍历每个 VAO 来绑定(bind
目前我有一个包含 2 个缓冲区的系统,一个创建 CPU 端并设置为一个缓冲区。然后一个来自 ssbo 并从另一个着色器填充。 这是 ssbo 数据的结构: struct ssbo_data_t {
我是一名优秀的程序员,十分优秀!