尝试 glUseProgram 时出现 Opengl 错误 1281

2024-04-17

我有什么想法可以调试这个opengl进一步错误?1281

我正在从文件加载源代码,编译,链接,然后尝试检查错误glUseProgram

在我的对象的绘制方法中..

log.info(gl2.glIsProgram(shaderProgram)); // true
gl2.glUseProgram(shaderProgram);

int error;
while ((error = gl2.glGetError()) != GL2.GL_NO_ERROR) {
    throw new RuntimeException("glUseProgram" + ": glError " + error);
}

输出 ..

[13:38:08] INFO (IARectangle.java:99) - true
java.lang.RuntimeException: glUseProgram: glError 1281

这就是我从 .glsl 文件加载着色器源的方式..

Vector<Integer> shaders = new Vector<Integer>();

try {

    shaders.add(compileSource(
        loadSource("shaders/vertexShader.glsl"),
        loadSource("shaders/fragmentShader.glsl")));

    return shaders;

} catch (Exception e) {
    e.printStackTrace();
    return shaders;
}

public String[] loadSource(String filename){

    StringBuilder sb = new StringBuilder();
    try {

        InputStream is = getClass().getClassLoader().getResourceAsStream(filename);
        BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
        String line;
        while ((line = br.readLine()) != null) {

            sb.append(line);
            sb.append('\n');
        }
        is.close();

    } catch (Exception e) {
        e.printStackTrace();
    }

    return new String[] { sb.toString() };
}

public final int compileSource(final String[] vertexSource, final String[] fragmentSource) throws Exception {

     vertexShaderProgram;
    int fragmentShaderProgram;
    int shaderProgram;

    // load vertexShader source, compile and verify
    vertexShaderProgram = gl2.glCreateShader(GL2.GL_VERTEX_SHADER);
    gl2.glShaderSource(vertexShaderProgram, 1, vertexSource, null, 0);
    gl2.glCompileShader(vertexShaderProgram);
    verifyCompile(gl2, vertexShaderProgram);

    // load fragmentShader source, compile and verify
    fragmentShaderProgram = gl2.glCreateShader(GL2.GL_FRAGMENT_SHADER);
    gl2.glShaderSource(fragmentShaderProgram, 1, fragmentSource, null, 0);
    gl2.glCompileShader(fragmentShaderProgram);
    verifyCompile(gl2, fragmentShaderProgram);

    shaderProgram = gl2.glCreateProgram();

    gl2.glAttachShader(shaderProgram, vertexShaderProgram);
    gl2.glAttachShader(shaderProgram, fragmentShaderProgram);
    gl2.glLinkProgram(shaderProgram);
    IntBuffer intBuffer = IntBuffer.allocate(1);
    gl2.glGetProgramiv(shaderProgram, GL2.GL_LINK_STATUS, intBuffer);

    if (intBuffer.get(0) != 1){

        String infoLog = null;
        gl2.glGetProgramiv(shaderProgram, GL2.GL_INFO_LOG_LENGTH, intBuffer);
        int size = intBuffer.get(0);
        log.error("Program link error: ");
        if (size > 0) {

            ByteBuffer byteBuffer = ByteBuffer.allocate(size);
            gl2.getGL2().glGetProgramInfoLog(shaderProgram, size, intBuffer, byteBuffer);
            byte[] sizeBytes = new byte[size];
            byteBuffer.get(sizeBytes, 0, size);
            infoLog = new String(sizeBytes);

            log.error("info: " + infoLog);

        } else {
            log.error("Unknown");
        }
        System.exit(1);
        return shaderProgram;

    } else {

        return shaderProgram;
    }
}

顶点着色器源码..

#version 120

uniform mat4 uMVPMatrix;
attribute vec4 vPosition;

void main() {
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
    //gl_Position = uMVPMatrix * vPosition;
}

片段着色器源码..

#version 120

uniform vec4 vColor;

void main() {
    gl_FragColor = vColor;
}

乍一看,我不知道为什么glGetError正在返回错误代码。但为了回答您的具体问题“如何进一步调试此错误?”,我确实有一个建议。

将您的绘制代码更改为:

// Logging errors before the call to glUseProgram
int error;
while ((error = gl2.glGetError()) != GL2.GL_NO_ERROR) {
    log.info(error);
}

log.info(gl2.glIsProgram(shaderProgram)); // true
gl2.glUseProgram(shaderProgram);

int error;
while ((error = gl2.glGetError()) != GL2.GL_NO_ERROR) {
    throw new RuntimeException("glUseProgram" + ": glError " + error);
}

请注意,这里的区别是我们添加了一个代码块来记录返回的错误glGetError before打电话给glUseProgram。原因是因为该错误不一定源自您的调用glUseProgram。如果您看到使用上面的代码记录的 1281 错误,您可以确定该错误实际上是源自在glUseProgram call.

看看文档 https://www.opengl.org/sdk/docs/man/docbook4/xhtml/glGetError.xml for glGetError:

glGetError 返回错误标志的值。每个可检测到的错误 被分配了数字代码和符号名称。当发生错误时, 错误标志被设置为适当的错误代码值。没有其他 错误会被记录,直到调用 glGetError 为止,错误代码为 返回,并且标志重置为 GL_NO_ERROR。

因此,如果您早期的 OpenGL 调用之一(可能是您的compileSource函数,例如)记录了1281错误,并且您没有调用glGetError从该点到您的呼叫之间的任何位置glUseProgram,您不能合理地假设该错误实际上源自glUseProgram call.

总之,glGetError不返回 OpenGL 调用记录的最新错误。你需要打电话glGetError具有更大的粒度,以便查明错误的根源。这将使您能够解决所遇到的问题并准确确定哪个 OpenGL 调用正在记录错误。

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

尝试 glUseProgram 时出现 Opengl 错误 1281 的相关文章

  • 如何创建一个 numpy 数组来描述三角形的顶点?

    我喜欢使用 Numpy 创建要传递到的顶点数组glsl Vertices将是一个包含 3 个顶点信息的 numpy 数组 Each vertex包括 pos x y 具有 32 位的 64 位有符号浮点格式 R 分量位于字节 0 3 中 3
  • glGenerateMipmap 是否在 sRGB 纹理的线性空间中执行平均?

    OpenGL 3 3 规范似乎没有要求 mipmap 生成在线性空间中完成 我能找到的只有以下内容 派生的 mipmap 数组的内部格式都与 levelbase 数组和派生数组的维度如下 第 3 8 14 节中描述的要求 的内容 派生数组是
  • libgdx 中帧缓冲区的结果不明确

    我得到以下奇怪的结果帧缓冲区 http libgdx badlogicgames com nightlies docs api com badlogic gdx graphics glutils FrameBuffer htmllibgdx
  • 使用 openGL、SOIL 加载图像

    我尝试了很多使用 SOIL 在 openGL 中加载和显示图像的示例 运行下面的源代码时 它仅显示一个没有图像的白色四边形 我尝试打开一个名为 foto 的图像 我将图像文件放在程序的文件夹中 bool keyStates new bool
  • OpenGL 说“from_param 收到了一个不连续的数组”

    安装 Yosemite 后 我必须升级 numpy PyOpenGL 等 现在 以前运行的程序给了我以下堆栈跟踪 file latebind pyx line 44 in OpenGL accelerate latebind Curry c
  • 纹理openGl。 C++、qt

    我试图用草纹理覆盖我的地形 由高度图制成 但它没有按预期工作 我什至无法在简单的 GL QUAD 上获取纹理 结果是多色网络 void GLWidget initializeGL glEnable GL TEXTURE 2D 在 QGLwi
  • 三角形未在 OSX 上的 OpenGL 2.1 中绘制

    我正在学习有关使用 OpenGL 在 Java 中创建游戏引擎的教程 我正在尝试在屏幕上渲染一个三角形 一切运行良好 我可以更改背景颜色 但三角形不会显示 我还尝试运行作为教程系列的一部分提供的代码 但它仍然不起作用 教程链接 http b
  • OpenGL z轴指向哪里?

    我正在尝试了解 OpenGL 坐标系 我到处都看到它被描述为右撇子 但这与我的经验不符 我尝试绘制一些形状和 3 d 对象 我发现 z 轴显然指向 屏幕 而 x 指向右侧 y 指向上方 这是左手坐标系的描述 我缺少什么 编辑 例如 http
  • gluPerspective 与 gluOrtho2D

    我查看了 MSDN 上关于这两个函数的文档 但是 我不太明白这两个功能之间的区别 一个是用于设置 3D 相机视图 另一个是用于设置 2D 相机视图 如果能得到解答就太好了 预先感谢您的评论 正交投影基本上是没有透视的 3D 投影 本质上 这
  • OpenGL 着色器不与着色器程序链接

    我正在尝试使用 GLFW GLEW 添加着色器 我收到一个错误 指出着色器已加载 但它们没有有效的对象代码 这是我用于加载着色器的代码 class SHADER public void LoadShaders const char vert
  • GLSL 棋盘图案

    我想用跳棋来遮蔽四边形 f P 下限 Px 下限 Py mod2 我的四边形是 glBegin GL QUADS glVertex3f 0 0 0 0 glVertex3f 4 0 0 0 glVertex3f 4 4 0 0 glVert
  • 将像素传递给 glTexImage2D() 后会发生什么?

    例如 如果我创建一个像素数组 如下所示 int getPixels int pixels new int 10 pixels 0 1 pixels 1 0 pixels 1 1 etc glTexImage2D getPixels glTe
  • Eclipse 标记 OpenGL 函数无法解析

    我尝试在 Eclipse C C 中使用一些 OpenGL 函数 一些 标准 函数如 GlClear 可以被 eclipse 识别 而其他函数如 glBindBuffer 和 glEnableVertexAttribArray 则不能 它们
  • glBlitFramebuffer 渲染缓冲区和渲染全屏纹理哪个更快?

    哪个更快更高效 使用 OpenGL 纹理作为 CUDA 表面并在四边形上渲染 新样式 使用渲染缓冲区作为 CUDA 表面并使用 glBlitFramebuffer 进行渲染 None
  • 使用 C# 截取任何外部应用程序的屏幕截图

    我们有一个 C WPF 应用程序 我们想要在其中截取我们启动的任意应用程序的屏幕截图 即 我们可以引用我们启动的进程 应用程序可能已最小化或位于其他窗口后面 但我们仍然只需要单个应用程序的图像 而不是重叠像素 我知道使用 BitBlt 或的
  • 如果我用opengl绘图的话SDL Renderer就没用了吗?

    我正在学习 SDL2 但我也在使用使用 OpenGL 调用的 imgui 库 从我在网上各种博客上读到的内容来看 我无法轻松混合 SDL2 渲染器和 opengl 调用 我要么使用其中之一 要么使用另一个 我读过的大多数教程都使用渲染器 所
  • 为什么OpenGL使用float而不是double? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • WebGL - 如何传递无符号字节顶点属性颜色值?

    我的顶点由具有以下结构的数组组成 Position colour float float float byte byte byte byte 传递顶点位置没有问题 gl bindBuffer gl ARRAY BUFFER this vbo
  • 为什么拥有单独的投影矩阵但结合模型和视图矩阵会有好处?

    当您学习 3D 编程时 您会被告知用 3 个变换矩阵来思考是最简单的 模型矩阵 该矩阵对于每个模型都是独立的 它根据需要旋转和缩放对象 最后将其移动到 3D 世界中的最终位置 模型矩阵将模型坐标转换为世界坐标 视图矩阵 对于大量对象 如果不
  • OpenGL - 两个纹理的幂

    OpenGL 使用二次幂纹理 这是因为由于 MipMapping 某些 GPU 只接受 2 的幂纹理 当绘制比实际更大的纹理时 使用这些二次方纹理会导致问题 我想到了一种方法来解决这个问题 即仅在我们使纹理小于实际大小时使用 PO2 比率

随机推荐

  • 如何在C++中的cudaDeviceReset()之后重用tensorflow?

    我正在使用 C 开发一个大型 CUDA 应用程序 该应用程序运行各种模型 需要完全释放所有 GPU 内存 否则其他操作将失败 我能够在关闭所有 tf 会话并运行 cudaDeviceReset 后释放所有内存 但之后我无法运行任何新的张量流
  • web.py 处理程序类的参数

    有没有办法将参数传递给 web py 处理程序类构造函数 例如 这些参数可能来自命令行 当运行主 web py 脚本时 位于第一个参数 用作端口号 之后 当然 具体取决于你的意思 毕竟都是Python 考虑你有可用的web config这是
  • dplyr - ifelse 在 mutate 内使用列表

    给定一个数据框df像下面这样 text lt model var value M1 a 12211 M1 b1 10 21 M1 b2 5 07 M1 c1 41 8 M1 c2 58 2 M1 d 1 6 M2 a 11922 M2 b1
  • 什么时候使用 NSDecimal、NSDecimalNumber 而不是 double 更好?

    对于简单的用途 例如跟踪 65 1kg 等重量值 使用 NSDecimal NSDecimalNumber 比使用 double 有什么好处吗 我的理解是 在这种情况下 双精度 甚至浮点 提供了足够的精度 如果我错了 请纠正我 首先 阅读乔
  • 将对象实例替换为 C# 中的另一个对象实例

    在这个问题中 我想知道这是否以及如何可能 这种技术看起来非常糟糕 但似乎我正在使用的 API UnityEditor 正在做类似的事情 我只是好奇 如果对同一个对象有多个引用 是否可以将一个新对象实例化到同一个内存槽中 以便所有先前的引用都
  • 我应该选择哈希、对象还是数组来表示 Perl 中的数据实例?

    我一直想知道这个问题 但从未真正深入研究过 情况是这样的 我有一组比较大的数据实例 每个实例都有相同的集合或属性 例如 a child instance name age height weight hair color favorite
  • 如何在远程Tomcat上部署war

    我想使用 maven tomcat 插件在远程 Tomcat 上部署 WAR 但遇到问题并出现异常 如下所述 请指导 使用的命令 mvn tomcat redeploy 错误日志 ERROR Failed to execute goal o
  • conda init 在 Windows 上的 bash 中不起作用

    我在 Windows 上安装了 Git Bash 和 conda 它提供了两个程序 C Program Files Git git bash exe and C Program Files Git bin bash exe 后者 C Pro
  • 在 Mac OS X 上静态嵌入 Python 时动态符号查找失败

    我正在构建一个嵌入 Python 的 Mac OS X 应用程序 从技术上讲 我的应用程序是一个捆绑包 即它的主要可执行文件是 MH BUNDLE 它是另一个应用程序的插件 我希望它静态嵌入 Python 但希望能够动态加载扩展 我做了以下
  • 如何防止 Safari 在遵循同源重定向时删除授权标头?

    Safari 似乎放弃了Authorization遵循同源 301 重定向时的标头 例如这段JS代码 fetch api endpoint that redirects headers new Headers Authorization s
  • 核心 jQuery 库的单元测试

    它们是否存在 如果存在 文档和代码在哪里 它们位于 Git 的 test 目录中 https github com jquery jquery tree master test https github com jquery jquery
  • Web 组件中的模板 html 和模板字符串

    使用 html 模板 然后 html 导入 创建 Web 组件还是使用模板字符串更好 这些方法有何优缺点 Using html 模板文件更好地重用 同一个文件可以在不同的 Web 组件中使用 此外 它们在大多数 IDE 中都能更好地显示 因
  • 使用 Office365 日历 API 无法获取会议室的所有繁忙时间

    尝试获取日历事件 以便允许用户选择与会者和会议室可用的会议时间 我们正在使用 Outlook 日历 REST API v2 findMeetingTimes https msdn microsoft com en us office off
  • 将函数应用于数据框列表中的列并附加结果

    我想将函数应用于数据框列表 该函数从每个数据框中的两列中获取元素 将它们相加 然后将输出添加到新列中的每个数据框中 创建虚拟数据 df 1 lt data frame data cbind rnorm 5 0 rnorm 5 2 rnorm
  • 在已打开的网页上运行测试用例

    我想通过量角器运行我的测试用例 但由于某些限制 我希望量角器在已经打开的页面上启动 这意味着我不希望驱动程序通过加载 chrome 并转到测试用例中定义的 url 来启动 如果我可以使用屏幕上已打开的 url 然后使用测试用例中定义的内容进
  • 在 RapidJson 中循环数组并获取对象元素

    如何从 ConstrValueIterator 中获取值 在这种情况下 我知道数组的元素是字典 也称为对象 代码总结 for rapidjson Value ConstValueIterator itr rawbuttons Begin i
  • 是否有一个函数可以查找字符向量中的所有小写字母?

    我刚刚写了一个 但我想知道 R 中是否已经存在一个 顺便说一句 这是函数 欢迎提出改进建议 set seed 50 x lt sample c letters LETTERS 7 is lower lt function x unlist
  • 使用 DataInputStream 从文件读取非常慢

    我有一个包含大量数字的文件 我尝试使用以下代码从文件中读取它 但是速度非常慢 任何人都可以帮助减少时间吗 以下是我以非常慢的方式读取它的代码 import java io BufferedInputStream import java io
  • 异步绘图和触摸

    我有一个绘制区域 UIView 我在 CGContextRef 中绘制 当然 我正在捕捉触摸来画画 虽然 drawRect 方法缓慢绘制大量现有对象 但不会捕获触摸 如果我在单独的线程中或使用函数 dispatch async 在drawR
  • 尝试 glUseProgram 时出现 Opengl 错误 1281

    我有什么想法可以调试这个opengl进一步错误 1281 我正在从文件加载源代码 编译 链接 然后尝试检查错误glUseProgram 在我的对象的绘制方法中 log info gl2 glIsProgram shaderProgram t