OpenGL 2 纹理内部格式 GL_RGB8I、GL_RGB32UI 等

2024-04-02

我正在重写大部分纹理代码。我希望能够指定某些内部格式:GL_RGB8I、GL_RGB8UI、GL_RGB16I、GL_RGB16UI、GL_RGB32I 和 GL_RGB32UI。这些标记在 OpenGL 2 中不存在。

当将这些内部格式指定为 glTexImage2D 的参数时,纹理会失败(纹理显示为白色)。检查错误时,我得到[编辑:] 1282(“无效操作”)。我认为这意味着 OpenGL 仍在使用 OpenGL 2 来处理 glTexImage2D,因此调用失败。显然,它需要使用更新的版本才能成功。像 GL_RGB、GL_RGBA 和(奇怪的是)GL_RGB32F、GL_RGBA32F 这样的枚举可以按预期工作。

我配置为使用 GLEW 或 GLee 进行扩展。我可以在其他地方使用 OpenGL 4 调用,没有任何问题(例如,glPatchParameteri、glBindFramebuffer 等),并且有问题的枚举肯定存在。为了完整起见,glGetString(GL_VERSION) 返回“4.2.0”。我的问题:我可以强制这些扩展库之一使用 OpenGL 4.2 版本吗?如果是这样,怎么办?

编辑:代码太复杂,无法发布,但这里是一个使用 GLee 的简单、独立的示例,也演示了该问题:

#include <GLee5_4/GLee.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <gl/glut.h>
//For Windows
#pragma comment(lib,"GLee.lib")
#pragma comment(lib,"opengl32.lib")
#pragma comment(lib,"glu32.lib")
#pragma comment(lib,"glut32.lib")

#include <stdlib.h>
#include <stdio.h>

const int screen_size[2] = {512,512};
#define TEXTURE_SIZE 64

//Choose a selection.  If you see black, then texturing is working.  If you see red, then the quad isn't drawing.  If you see white, texturing has failed.
#define TYPE 1

void error_check(void) {
    GLenum error_code = glGetError();
    const GLubyte* error_string = gluErrorString(error_code);
    (error_string==NULL) ? printf("%d = (unrecognized error--an extension error?)\n",error_code) : printf("%d = \"%s\"\n",error_code,error_string);
}

#if   TYPE==1 //############ 8-BIT TESTS ############
    inline GLenum get_type(int which) { return (which==1)?    GL_RGB8: GL_RGB; } //works
#elif TYPE==2
    inline GLenum get_type(int which) { return (which==1)?   GL_RGBA8:GL_RGBA; } //works
#elif TYPE==3
    inline GLenum get_type(int which) { return (which==1)?  GL_RGB8UI: GL_RGB; } //doesn't work (invalid op)
#elif TYPE==4
    inline GLenum get_type(int which) { return (which==1)?   GL_RGB8I: GL_RGB; } //doesn't work (invalid op)
#elif TYPE==5
    inline GLenum get_type(int which) { return (which==1)? GL_RGBA8UI:GL_RGBA; } //doesn't work (invalid op)
#elif TYPE==6
    inline GLenum get_type(int which) { return (which==1)?  GL_RGBA8I:GL_RGBA; } //doesn't work (invalid op)
#elif TYPE==7 //############ 16-BIT TESTS ############
    inline GLenum get_type(int which) { return (which==1)?   GL_RGB16: GL_RGB; } //works
#elif TYPE==8
    inline GLenum get_type(int which) { return (which==1)?  GL_RGBA16:GL_RGBA; } //works
#elif TYPE==9
    inline GLenum get_type(int which) { return (which==1)? GL_RGB16UI: GL_RGB; } //doesn't work (invalid op)
#elif TYPE==10
    inline GLenum get_type(int which) { return (which==1)?  GL_RGB16I: GL_RGB; } //doesn't work (invalid op)
#elif TYPE==11
    inline GLenum get_type(int which) { return (which==1)?GL_RGBA16UI:GL_RGBA; } //doesn't work (invalid op)
#elif TYPE==12
    inline GLenum get_type(int which) { return (which==1)? GL_RGBA16I:GL_RGBA; } //doesn't work (invalid op)
#elif TYPE==13 //############ 32-BIT TESTS ############
    inline GLenum get_type(int which) { return (which==1)?   GL_RGB32: GL_RGB; } //token doesn't exist
#elif TYPE==14
    inline GLenum get_type(int which) { return (which==1)?  GL_RGBA32:GL_RGBA; } //token doesn't exist
#elif TYPE==15
    inline GLenum get_type(int which) { return (which==1)? GL_RGB32UI: GL_RGB; } //doesn't work (invalid op)
#elif TYPE==16
    inline GLenum get_type(int which) { return (which==1)?  GL_RGB32I: GL_RGB; } //doesn't work (invalid op)
#elif TYPE==17
    inline GLenum get_type(int which) { return (which==1)?GL_RGBA32UI:GL_RGBA; } //doesn't work (invalid op)
#elif TYPE==18
    inline GLenum get_type(int which) { return (which==1)? GL_RGBA32I:GL_RGBA; } //doesn't work (invalid op)
#elif TYPE==19 //############ 32-BIT FLOAT ############
    inline GLenum get_type(int which) { return (which==1)?  GL_RGB32F: GL_RGB; } //works
#elif TYPE==20
    inline GLenum get_type(int which) { return (which==1)? GL_RGBA32F:GL_RGBA; } //works
#endif

GLuint texture;
void create_texture(void) {
    printf("    Status before texture setup: "); error_check();

    glGenTextures(1,&texture);
    glBindTexture(GL_TEXTURE_2D,texture);

    printf("    Status after texture created: "); error_check();

    GLenum data_type = GL_UNSIGNED_BYTE;
    int data_length = TEXTURE_SIZE*TEXTURE_SIZE*4; //maximum number of channels, so it will work for everything
    unsigned char* data = new unsigned char[data_length];
    for (int i=0;i<data_length;++i) {
        data[i] = (unsigned char)(0);
    };

    glTexImage2D(GL_TEXTURE_2D,0,get_type(1), TEXTURE_SIZE,TEXTURE_SIZE, 0,get_type(2),data_type,data);

    printf("    Status after glTexImage2D: "); error_check();

    delete [] data;

    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

    printf("    Status after texture filters defined: "); error_check();
}

void keyboard(unsigned char key, int x, int y) {
    switch (key) {
        case 27: //esc
            exit(0);
            break;
    }
}

void draw(void) {
    glClearColor(1.0,0.0,0.0,1.0); //in case the quad doesn't draw
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

    glViewport(0,0,screen_size[0],screen_size[1]);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0,screen_size[0],0,screen_size[1]);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glBegin(GL_QUADS);
    glTexCoord2f(0,0); glVertex2f(0,0);
    glTexCoord2f(2,0); glVertex2f(screen_size[0],0);
    glTexCoord2f(2,2); glVertex2f(screen_size[0],screen_size[1]);
    glTexCoord2f(0,2); glVertex2f(0,screen_size[1]);
    glEnd();

    glutSwapBuffers();
}

int main(int argc, char* argv[]) {
    glutInit(&argc,argv);
    glutInitWindowSize(screen_size[0],screen_size[1]);
    glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE|GLUT_DEPTH);
    glutCreateWindow("Texture Types - Ian Mallett");

    glEnable(GL_DEPTH_TEST);
    glEnable(GL_TEXTURE_2D);

    printf("Status after OpenGL setup: "); error_check();

    create_texture();

    printf("Status after texture setup: "); error_check();

    glutDisplayFunc(draw);
    glutIdleFunc(draw);
    glutKeyboardFunc(keyboard);

    glutMainLoop();

    return 0;
}

检查错误时,我得到[编辑:] 1282(“无效操作”)。我认为这意味着 OpenGL 仍在使用 OpenGL 2 来处理 glTexImage2D,因此调用失败。

OpenGL 错误 http://www.opengl.org/wiki/GL_Error_Codes理解起来并不复杂。GL_INVALID_ENUM/VALUE当您传递意外的、不受支持的或超出范围的枚举或值时,会抛出异常。如果将“17”作为内部格式传递给glTexImage2D, 你会得到GL_INVALID_ENUM,因为 17 不是内部格式的有效枚举数。如果将 103,422 作为宽度传递给glTexImage2D, 你会得到GL_INVALID_VALUE,因为 103,422 几乎肯定大于GL_MAX_TEXTURE_2D's size.

GL_INVALID_OPERATION总是用于组合出错的状态。要么是先前设置的某些上下文状态与您正在调用的函数不相符,要么是两个或多个参数组合导致了问题。后者就是您这里的情况。

如果您的实现根本不支持整数纹理,那么您会得到INVALID_ENUM(因为内部格式不是有效格式)。得到INVALID_OPERATION意味着其他事情出了问题。

也就是说,这个:

glTexImage2D(GL_TEXTURE_2D,0,get_type(1), TEXTURE_SIZE,TEXTURE_SIZE, 0,get_type(2),data_type,data);

Your get_type(2)来电返回GL_RGB or GL_RGBA在所有情况下。然而,当使用积分时图像格式 http://www.opengl.org/wiki/Image_Format#Color_formats, you must use a 像素传输格式_INTEGER在最后 http://www.opengl.org/wiki/Pixel_Transfer#Pixel_format.

So your get_type(2)需要是这样的:

inline GLenum get_type(int which) { return (which==1)? GL_RGB16UI: GL_RGB_INTEGER; }

对于其他完整图像格式也类似。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenGL 2 纹理内部格式 GL_RGB8I、GL_RGB32UI 等 的相关文章

  • MATLAB 图形渲染:OpenGL 与 Painters?

    当谈到使用哪个渲染器来处理 MATLAB 图形或何时它很重要时 我一无所知 但我遇到过某些示例 其中does matter plot 0 0 ko markersize 50 linewidth 8 set gcf renderer ope
  • 在 OpenGL 中使用不同的着色器程序?

    我必须在 OpenGL 中针对不同的对象使用两个不同的着色器程序 我发现我必须使用glUseProgram 在不同的着色器程序之间切换 但对此没有太多信息 鉴于我有两个用于不同对象的不同着色器程序 如何为每个着色器程序生成和绑定 VAO 和
  • 渲染 TTF SDL2.0 opengl 3.1

    我正在使用 SDL2 0 并使用 半现代 opengl 3 1 我希望向我的应用程序添加文本叠加 并在应用程序中呈现 TTF 我将如何使用现代 OpenGL 来解决这个问题 编辑 根据 genpfault 的建议 我尝试使用 SDL TTF
  • OpenGL:VAO 和 VBO 对于大型多边形渲染任务是否实用?

    如果您想渲染一次在视锥体中包含数千个多边形的大型景观 并且用户的视点不断变化 那么使用 VAO 或 VBO 是否实用 我的意思是 每次玩家的位置或摄像机旋转发生变化时 您都必须重新计算顶点数据 以便正确剔除不再可见的任何顶点或场景 以保持良
  • 如何计算正切和副法线?

    谈谈OpenGL着色语言 GLSL 中的凹凸贴图 镜面高光之类的东西 I have 顶点数组 例如 0 2 0 5 0 1 0 2 0 4 0 5 法线数组 例如 0 0 0 0 1 0 0 0 1 0 0 0 世界空间中点光源的位置 例如
  • 在 OpenGL 中渲染纹理 1 到 1

    所以我想做的是使用 OpenGL 和 C 将纹理渲染到平面上 作为显示图像的一种方式 但是我需要确保在渲染纹理时没有对纹理进行任何处理 抗锯齿 插值 平滑 模糊等 这是 OpenGL 处理渲染纹理的默认方式吗 或者是否需要设置一些标志才能禁
  • glDeleteTextures在Windows上似乎没有释放纹理内存,有没有解决办法?

    我的 openGL 应用程序内存不足 遇到一些问题 我正在尝试找出我的问题 为此 我创建了一个小型测试程序 它基本上只是从调用 glDeleteTextures 的文件中加载一个巨大的纹理 然后再次加载它 如果我在 OSX 上运行这个测试程
  • 渲染到一个颜色通道而不影响其他通道

    使用 OpenGL 任何版本 如何通过一次仅影响一个颜色通道来渲染到帧缓冲区对象 例如 我的帧缓冲区对象具有 GL BGRA 布局 现在我想执行一些渲染命令 这些命令应该只改变红色通道 因此 如果片段用颜色 204 0 0 0 渲染并且像素
  • Qt 5.5 QOpenGLWidget 链接错误未链接任何 openGL 调用

    我尝试使用 Qt 5 5 1 构建一个简单的 OpenGL 应用程序 一切都很好 直到我尝试使用 glClearColor 等 openGL 本机函数调用 该小部件实际上编译并产生黑屏 但在我尝试使用任何 openGL 本机函数后 它甚至不
  • 如何在OpenGL中像这样绘制连接的带状线

    我想用以下方式绘制一系列连接线 GL LINE STRIP 我尝试过自己编写代码 但没有得到想要的结果 所以我来到这里 帮助我找出我错在哪里 这里我只给出我的draw 函数 glBegin GL LINE STRIP glVertex2f
  • Windows 上的 OpenGL SDK

    我正在尝试编写一个 OpenGL 应用程序 因此我安装了 Windows 7 SDK 然而 它似乎是OpenGL 1 1 define GL VERSION 1 1 1 如何找到我安装的 OpenGL 版本 dll 以及在哪里可以找到较新的
  • 使用普通画布/文本输出更新LayeredWindow

    有没有一种方法可以使用画布在表单上绘图 然后使用 updatelayeredwindow 这样表单就不可见 但文本可见 就像只显示文本的半透明表单一样 如果没有 那么有没有办法只用画布 opengl directx 制作某种半透明形式 我想
  • OpenGL 与 OpenCL,选择哪个以及为什么?

    哪些功能使 OpenCL 能够独特地选择 OpenGL 和 GLSL 进行计算 尽管有与图形相关的术语和不实用的数据类型 OpenGL 是否有任何真正的警告 例如 可以通过使用其他纹理将 a 渲染到纹理来完成并行函数评估 减少操作可以通过迭
  • 使用 OpenGL 渲染 QImage

    与我相关的其他问题 https stackoverflow com questions 20126354 render qimage from sooffscreenrenderer in qglwidget 我认为更核心的问题是 如何渲染
  • OpenGL 缓冲区、glFlush 和 glutSwapBuffers()

    使用之间有什么区别吗 glutInitDisplayMode GLUT SINGLE GLUT RGB with glFlush and glutInitDisplayMode GLUT DOUBLE GLUT RGB with glutS
  • SDL 程序中颜色关闭

    我目前正在开发一个非常简单的游戏 使用纯 C 方法和 SDL 及其官方额外库 如 SDL image 和 OpenGL 现在 虽然我遇到了一些障碍 但我不知道为什么要这样做 绘制时颜色全部关闭 我目前在 Mac 上运行该程序 但如果我没记错
  • glTranslatef 不在 glBegin .. glEnd 中工作

    我正在尝试并排绘制不同颜色的两个方块 我的问题是我无法让 glTranslatef 将第二个方块向右移动 第二个方块只是绘制在第一个方块上 void display void glClear GL COLOR BUFFER BIT glMa
  • 是否可以在 Mac OS X 上构建 FreeGLUT?

    我正在做一些关于 OpenGL 的教程 http www arcsynthesis org gltut Basics Tutorial 2001 html那个使用FreeGLUT http freeglut sourceforge net
  • 从 Maya 导出时,DAE 文件图像纹理不会显示在 Aframe 中

    我已从 Maya 导出带有图像纹理的 dae 文件 但是 当该 dae 文件与 A Frame 一起使用时 图像纹理不会出现 您只能看到基础材质 我可以在 Maya 中使用什么导出器来解决此问题 下面是 PSD 和 Aframe 中的相同
  • OpenGL/GLSL - 纹理过滤的实现

    我想在 GLSL 着色器中自己实现纹理过滤 min 和 magfilter 因为我想使用 image load and store 而不是采样器 而且我想以特殊方式处理未定义的像素 并且我正在寻找一篇文章或者这样讨论过滤过程 我记得如何从我

随机推荐

  • MUI:如何以编程方式删除 DataGrid 中选定的行?

    我正在使用 MUI 创建文件列表DataGrid 用户可以选中复选框DataGrid做出他们的选择 我希望在用户执行某些操作 例如删除所选文件 后重置该复选框 我面临的问题是在执行删除操作后 该复选框仍然在同一位置被选中 例如 在我按下删除
  • 更改搜索栏拇指的大小

    我正在使用可绘制的搜索栏拇指 android thumb drawable thumb 我怎样才能设置这个拇指的大小dip单元 因为我使用类似搜索栏的样式 我想要拇指12dip高度和宽度 对我来说设置拇指大小的最灵
  • org.springframework.beans.factory.BeanCreationException:创建类路径资源中定义的名称为“scriptDataSourceInitializer”的bean时出错?

    我是学习 Spring Boot Web 的新手 我已经开始学习 spring jpa 数据 我使用 h2 数据库 我想使用插入测试数据 org springframework beans factory BeanCreationExcep
  • 仅显示 SQL 查询的前 N ​​行输出

    有没有办法只显示前 N 行输出SQL query 如果查询停止运行一次 则奖励积分N输出行 我最感兴趣的是找到适用于的东西Oracle 如果您指定您的目标数据库将会很有帮助 不同的数据库有不同的语法和技术来实现这一点 例如 在 Oracle
  • Git:如何排除存储库中的子文件夹?

    我已经在我的项目的文件夹中创建了一个存储库 你知道 git init 我有Webstorm文件夹 idea另一个与此无关的文件夹 我对保留在存储库中不感兴趣 并且我不希望此文件夹显示为要添加的新文件 我想忘记这些子文件夹 如何在提交整个存储
  • vertx 内的多线程

    我是 vert x 的新手 我正在尝试 vert x NetServer 功能 http vertx io core manual java html writing tcp servers and clients http vertx i
  • 下载 Fuchsia 源代码 - Jiri 钩子由于更新项目或包时出现致命错误而未运行

    Per 获取紫红色源代码 https fuchsia dev fuchsia src development source code echo PATH media cwh 32GB swdev fuchsia jiri root bin
  • 如何在 SQLite 中拥有自动时间戳?

    我有一个 SQLite 数据库版本 3 我正在使用 C 创建一个使用该数据库的应用程序 我想在表中使用时间戳字段来实现并发 但我注意到当我插入新记录时 该字段未设置 并且为空 例如 在 MS SQL Server 中 如果我使用时间戳字段
  • OpenCV 使用 k 均值对图像进行色调分离

    我想在 C 接口 cv 命名空间 中使用 k means 和 OpenCV 对图像进行色调分离 但得到了奇怪的结果 我需要它来减少一些噪音 这是我的代码 include cv h include highgui h using namesp
  • 在 AngularJS 中下载 zip 文件

    尝试在 AngularJS 中下载 zip 文件 我查看了AngularJS 从服务器下载pdf文件 https stackoverflow com questions 25490007 angularjs download pdf fil
  • 按时间间隔分组

    我需要将我的表分组为 15 分钟的间隔 我可以这样做 select dateadd minute datediff minute 0 ts 15 15 0 sum goodpieces from StationCount Group by
  • 在mongodb中查找按距离排序的LineString附近的点

    我有一组代表街道 黑线 的点和代表地图上某个地点的点 红点 我想找到指定街道附近的所有点 按距离排序 我还需要能够指定最大距离 蓝色和绿色区域 这是一个简单的例子 我想用 near运算符 但它只接受Point作为输入 而不是LineStri
  • 如何确定您是否使用不带 $_SERVER['HTTPS'] 的 HTTPS

    我在网上看到很多教程说你需要检查 SERVER HTTPS 如果服务器连接受 HTTPS 保护 我的问题是在我使用的一些服务器上 SERVER HTTPS 是一个未定义的变量 会导致错误 我可以检查是否还有另一个应该始终定义的变量 需要明确
  • NSExtensionRequestHandling 不处理本机消息

    我正在尝试为我的本机应用程序创建 Safari Web 扩展 我想要一个带有按钮的弹出窗口 单击该按钮将与我的本机应用程序进行通信 在开始这部分之前 我在发送本机消息并在其中处理它时遇到了问题beginRequest类中的函数符合NSExt
  • 如何确定 UIWebView 的内容大小?

    我有一个UIWebView具有不同的 单页 内容 我想了解一下CGSize内容以适当调整我的父母视图的大小 显而易见的 sizeThatFits 不幸的是只返回 webView 的当前帧大小 事实证明 我的第一个猜测是使用 sizeThat
  • 使用继承时出现重复的外键

    我创建了这些类 以便通过 EntityFramework 6 代码优先方法生成数据库模型 public class Vehicle public long Id get set public long ResponsiblePersonId
  • 卡兹马兹动画

    我正在寻求帮助 我想在 Matlab 上为 Kaczmarz 方法制作动画 它的方法允许通过在超平面上的串行投影解向量来找到方程组的解 该解向量由系统方程组给出 我想制作该矢量移动的动画 就像该点在投影矢量上一样 System of equ
  • Joomla 3.2.3 精选文章排序

    在 Joomla 3 2 3 中 我无法像 J 1 5 x 那样进行文章排序 我想让首页文章排序像我在管理员区域中定义的那样 我尝试了几种方法 但仍然没有任何成功 已经 1 周了 我最后一次尝试的是这样的 a Content gt Feat
  • 如何以编程方式获取类依赖项及其各自的文件位置?

    我需要获得给定项目的类之间的某种依赖关系图 即该特定类使用的所有类 我想知道给定的类正在使用哪些类 以便以后可以在项目中找到它们的文件路径 考虑以下简单示例 public class Dog Animal IBark public void
  • OpenGL 2 纹理内部格式 GL_RGB8I、GL_RGB32UI 等

    我正在重写大部分纹理代码 我希望能够指定某些内部格式 GL RGB8I GL RGB8UI GL RGB16I GL RGB16UI GL RGB32I 和 GL RGB32UI 这些标记在 OpenGL 2 中不存在 当将这些内部格式指定