我使用OpenGL4.X.最近我读到了这个 Apple OpenGLES2文档,其中声明使用交错属性数组可以提高IOS移动设备的性能,并且是推荐的方式(而不是使用属性块).
对于那些不明白我的意思的人来说,这是一个例子:
单个属性数组中的属性块:
float vertices[]{
//Triangle vertices:
v0x , v0y , v0z ,
v1x , v1y , v1z ,
v2x , v2y , v2z ,
//Triangle UVs:
uv0s , uv0t ,
uv1s , uv1t ,
uv2s , uv2t ,
//Triangle Normals:
n0x , n0y , n0z ,
n1x , n1y , n1z ,
n2x , n2y , n2z
}
Run Code Online (Sandbox Code Playgroud)
交错属性数组:
float vertices[]{
v0x , v0y , v0z ,
uv0s , uv0t , ////vertex 1 attributes
n0x , …Run Code Online (Sandbox Code Playgroud) 我何时使用STD140在OpenGL中使用统一块?
虽然我不是100%肯定,我相信有它的替代,可以实现同样的事情,所谓"共享".
它只是对编码器的偏好吗?或者是否有理由使用一个而不是另一个?
ARB_texture_storage被引入OpenGL 4.2核心.
你能解释一下纹理对象的不变性意味着什么吗?
为什么从以前的纹理使用情况来看更好,这个功能的缺点是什么?
我知道我可以阅读这个扩展的规范(我做了:)),但我想看一些例子或其他解释.
我在使用顶点缓冲区对象时遇到了麻烦,而没有使用顶点数组对象.
我的理解是VAO只是封装了VBO周围的状态.但是,如果没有VAO,VBO不应该可用吗?
这是一个小例子.有了use_vao=true这个工作正常(橙色呈现矩形).有了use_vao=false这使它什么,并生成GL_INVALID_OPERATION时的错误glDrawElements.
// make sure the modern opengl headers are included before any others
#include <OpenGL/gl3.h>
#define __gl_h_
#include <GLUT/glut.h>
#include <string>
#include <cassert>
// For rendering a full-viewport quad, set tex-coord from position
std::string tex_v_shader = R"(
#version 330 core
in vec3 position;
void main()
{
gl_Position = vec4(position,1.);
}
)";
// Render directly from color or depth texture
std::string tex_f_shader = R"(
#version 330 core
out vec4 …Run Code Online (Sandbox Code Playgroud) OpenGL具有数组纹理,由特定采样器类型的着色器表示:
sampler2DArray array_texture;
Run Code Online (Sandbox Code Playgroud)
但GLSL还允许将采样器聚合到数组中:
sampler2D array_of_textures[10];
Run Code Online (Sandbox Code Playgroud)
这两个功能是否相互关联?他们有什么不同?
可以说我有2种,如人类和小马.它们具有不同的骨骼系统,因此每个物种的均匀骨骼阵列必须不同.我是否必须实现两个单独的着色器程序才能正确渲染每个骨骼数组,或者是否有办法动态声明统一数组并迭代通过该动态数组?
记住性能(所有的着色器都在决策分支上徘徊).
我有一些3D代码,我注意到它不会在严格的核心配置文件中呈现,但在"正常"(未明确请求为核心)配置文件上下文中很好.为了找出问题,我编写了最简单的最简单的OpenGL程序,只绘制了一个三角形和一个矩形:

我在这里发布了OpenGL程序作为Gist.
将useStrictCoreProfile变量设置为false,程序不会向控制台输出错误消息,并根据上面的屏幕截图绘制四边形和三角形,包括Intel HD OpenGL 3.3和带OpenGL 4.2的GeForce.
但是,将useStrictCoreProfile设置为true,它会清除背景颜色但不会绘制tri和quad,控制台输出是这样的:
GLCONN: OpenGL 3.2.0 @ NVIDIA Corporation GeForce GT 640M LE/PCIe/SSE2 (GLSL: 1.50 NVIDIA via Cg compiler)
LASTERR: OpenGL error at step 'render.VertexAttribPointer()': GL_INVALID_OPERATION
LASTERR: OpenGL error at step 'render.DrawArrays()': GL_INVALID_OPERATION
LASTERR: OpenGL error at step 'render.VertexAttribPointer()': GL_INVALID_OPERATION
LASTERR: OpenGL error at step 'render.DrawArrays()': GL_INVALID_OPERATION
LASTERR: OpenGL error at step '(post loop)': GL_INVALID_OPERATION
EXIT
Run Code Online (Sandbox Code Playgroud)
...如果要求4.2严格的核心配置文件而不是3.2,则同样的问题.适用于3种不同的nvidia GPU,因此我假设我没有正确地符合严格的核心配置文件.我做错了什么,我该如何解决这个问题?
注意,你不会在上面的Gist中找到glEnableVertexAttribArray调用,因为它在我正在导入的glutil包中 - 但这确实被称为gist的compileShaders()函数中的最后一步.
OpenGL允许您在多个纹理之间共享单个数据存储,每个纹理都有自己的格式和尺寸.
(通过纹理视图)
现在,我的问题是:
是否意味着单个纹理源被多个实例引用(在这种情况下是纹理视图)?
它与使用相同的纹理对象有何不同,例如使用不同的采样器?
此外,是否意味着通过纹理视图更改纹理像素会改变原始纹理对象中的像素?(我认为答案是肯定的,因为doc说它是纹理存储的别名)
我在这里有点困难。我无法调试我的 C++ OpenGL 程序,因为激活调试消息会导致段错误。
我有一个我注册的调试回调函数:
static void APIENTRY openglCallbackFunction(
GLenum source,
GLenum type,
GLuint id,
GLenum severity,
GLsizei length,
const GLchar* message,
const void* userParam) {
(void)source; (void)type; (void)id;
(void)severity; (void)length; (void)userParam;
fprintf(stderr, "%s\n", message);
if (severity==GL_DEBUG_SEVERITY_HIGH) {
fprintf(stderr, "Aborting...\n");
abort();
}
}
Run Code Online (Sandbox Code Playgroud)
我在以下代码中启动调试上下文:
this->window = glfwCreateWindow(this->winx, this->winy, "Cortex Stretcher", NULL, NULL);
if(this->window == NULL) {
fprintf(stderr, "Failed to open GLFW window. If you have an Intel GPU, they are not 3.3 compatible. Try the 2.1 version of the tutorials.\n" …Run Code Online (Sandbox Code Playgroud) 在新的OpenGL版本(3.0和4.0版本)中,不推荐使用gl_Vertex等内置顶点属性.实际渲染任何东西的"新方法"是为位置,颜色等指定自己的顶点属性,然后将这些自定义属性绑定到缓冲区.
我的问题是:如果不将渲染代码和着色器紧密耦合,怎么能做到这一点?如果我编写一个使用"position"作为顶点位置的着色器,使用着色器的主代码必须知道并将顶点数据作为"position"传递.如果我想使用写入的不同着色器来获取"vertex_pos"中的顶点数据,我必须首先重写该着色器,或者修改我的主机代码以将顶点数据发送为"vertex_pos".
是否有一组所有着色器应使用的标准顶点和片段属性的最佳实践名称?或者是否存在Balkanized引擎特定标准,以便为一个引擎编写的着色器无法在没有修改的情况下在另一个引擎上工作?或者根本没有标准,一般来说,每个对象都需要自己的自定义渲染代码来匹配其自定义着色器?