小编asl*_*slg的帖子

Open GL - 为什么像素值采用 ABGR 以及如何在 RGBA 中使用它们

我有一些用于加载纹理的代码,其中我使用 DevIL 加载图像,然后 OpenGL 从像素创建纹理。这段代码工作正常,纹理显示正确,这一切都很好。

除此之外,我还可以从程序内创建一个数组来创建纹理或直接更改纹理的像素。我的问题在于:处理像素时,它们的格式似乎是 ABGR 而不是我希望的 RGBA。

我偶然发现了这个问题,它指的是在 glTexImage2D 函数中传递的格式:

(...) 如果你有 GL_RGBA 和 GL_UNSIGNED_INT_8_8_8_8,这意味着像素存储在 32 位整数中,并且颜色按照这样的整数中的逻辑顺序 RGBA 排列,例如,红色位于高位字节,而颜色位于高位字节。 alpha 位于低位字节。但如果机器是小尾数法(如 Intel CPU),则内存中的实际顺序是 ABGR。而 GL_RGBA 和 GL_UNSIGNED_BYTE 将以 RGBA 顺序存储字节,无论计算机是小端还是大端。(...)

事实上我有一个英特尔CPU。图像按照现在的方式加载得很好,我实际上使用 GL_RGBA 模式和 GL_UNSIGNED_BYTE 类型。

GLuint makeTexture( const GLuint* pixels, GLuint width, GLuint height ) {

    GLuint texture = 0;

    glGenTextures( 1, &texture );

    glBindTexture( GL_TEXTURE_2D, texture );

    glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels );

    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
    glTexParameteri( GL_TEXTURE_2D, …
Run Code Online (Sandbox Code Playgroud)

c++ opengl pixelformat

5
推荐指数
1
解决办法
3579
查看次数

我怎样才能使用着色器将一个3D对象变形为另一个?

对于最新的Ludum Dare比赛,主题是变形,所以我的想法涉及从一个几何形状到另一个几何形状的简单变形.

所以我做的是我在Blender中制作了一些具有相同顶点数的对象.在OpenGL中,我为每个对象创建了单独的VAO,并为"变形"对象创建了一个额外的VAO(具有动态绘制属性).每个帧,当玩家变形时,我会将当前对象和目标对象之间的插值顶点数据上传到这个额外的VAO中,然后渲染.否则只渲染对象的相应VAO.Morphing看起来像这样:

变形形状

(顶点有不同的排序,因此变形不是"平滑的")

由于我没有多少时间做一些快速而肮脏的事情,但现在我认为这不是一个很好的方法来完成这个过程,因为我必须每帧向GPU上传大量数据.如果我想在不同的变形阶段绘制多个变形对象,它也看起来不可扩展.

作为改进此过程的第一步,我想将这些插值计算移动到着色器中.我可以将单个VAO中的所有对象的数据存储在单独的属性中,然后选择要插入的属性.

但我想知道:有没有办法以某种方式将多个(两个)对象/缓冲区发送到着色器,并且插值率均匀,然后在着色器中我会进行插值?

c++ opengl 3d

3
推荐指数
1
解决办法
583
查看次数

标签 统计

c++ ×2

opengl ×2

3d ×1

pixelformat ×1