- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
关于如何进一步调试此 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
在调用 glUseProgram
之前返回的错误。原因是因为错误不一定源自您对 glUseProgram
的调用。如果您看到使用上述代码记录的 1281 错误,则可以确定该错误实际上源自 glUseProgram
调用之前进行的 OpenGL 调用。
看看 documentation对于 glGetError
:
glGetError returns the value of the error flag. Each detectable error is assigned a numeric code and symbolic name. When an error occurs, the error flag is set to the appropriate error code value. No other errors are recorded until glGetError is called, the error code is returned, and the flag is reset to GL_NO_ERROR.
因此,如果您之前的 OpenGL 调用之一(例如,可能是您的 compileSource
函数中的某些内容)记录了 1281
错误,而您没有调用 glGetError
在该点和您对 glUseProgram
的调用之间的任何位置,您不能合理地假设该错误实际上源自 glUseProgram
调用。
总之,glGetError
不会返回 OpenGL 调用记录的最新错误。您需要更精细地调用 glGetError
,以便查明错误的来源。这将使您能够解决遇到的问题并准确确定记录错误的 OpenGL 调用。
关于尝试 glUseProgram 时出现 Opengl 错误 1281,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30124343/
我认为(我不确定),每当我们调用 glUseProgram() 时,顶点着色器、碎片着色器、几何着色器等都会加载到 GPU 中相应类型处理器的程序内存中(例如顶点着色器 -> 顶点着色器)着色器处理器
我在纹理上使用 opengl 着色器。一旦纹理完成着色,我想停止 glUseProgram() 函数。 目前,着色器正在超越一切,包括我不需要着色的 rectf() 函数。 我尝试了 glUsePro
这与 Switch shader program in WebGL 有关,但我想重新提出这个问题,现在我对问题和我想问的问题有了更清晰的认识。 我正在尝试在不同的着色器程序之间切换,但在同一渲染中切换
The OpenGL docs for glUseProgram声称使用零参数对其进行调用将导致着色器执行的结果为undefined。 但是,经过一些搜索,我看到了一些使用glUseProgram卸载
假设我有一些代码在不同点调用 glUseProgram(programId) ,但有时最终会使用相同的参数调用 glUseProgram(1) 两次(即program1被请求两次)。 我应该消除对 g
我正在用 C 语言学习 OpenGL 和 Win32,我刚刚开始想要实现着色器。我这样做更多是作为一种学习体验而不是一个项目,所以我决定不使用典型的扩展管理器库,如 glew 或其他东西。这是我的扩展
我在以下代码中的 glUseProgram(mYUVProgram); 处收到 GL_INVALID_VALUE , 0x0501 错误。它发生在恢复应用程序时。根据glUseProgram docs
glUseProgram() 有多快?有没有更好(更快)的东西?: 这是我的想法: 使用 1 个通用着色器程序,但具有许多输入设置和属性(每个图形类的设置) 为每个图形类使用 1 个以上的着色器 更改
在 OpenGL 中,glUseProgram() 和 glUseShaderProgram() 有什么区别? MESA 和 Nvidia 似乎都提供了 glext.h,而在 GLEW 中,两者都有定
我正在关注 OpenGL v3.3 教程,该教程指示我使用 glUniform4f 修改片段着色器中的统一属性(请参阅下面的代码)。据我了解,OpenGL 是一个状态机,我们不会取消绑定(bind)当
调用禁用 glsl 程序是否需要 50 毫秒? 我之前做了一个glFlush,所以它不可能是在程序改变之前被刷新的管道。 启用着色器需要 0.03 毫秒。 最佳答案 只是猜测 - 如果您在启用兼容性的
关于如何进一步调试此 opengl 错误的任何想法? 1281 我正在从文件加载源代码、编译、链接,然后在 glUseProgram 之后尝试检查错误 在我对象的绘制方法中.. log.info(gl
我想出了渲染矩形的代码,但着色器不起作用。它仍然是空白的白色。 这里我将包含重要的代码 主要内容: float verts[] = { -.5f, -.5f, .0f, -.5f,
当我使用 glUseProgram 设置一个 prgram 时,然后通过 glGetIntegerv(GL_CURRENT_PROGRAM, &pid) 检查当前程序,但是 pid 返回 0。所以我不
我正在 Android 上的 OpenGL ES 2.0 中实现一个引擎。我有多个着色器,对象可以采用多个纹理。 我的目标是尽量减少对 OpenGL 的纹理绑定(bind)调用,因此我保留了每个着色器
我读到在 OpenGL 2(尤其是 ES)中优化非透明对象渲染顺序的最佳方法是优先避免上下文更改(绑定(bind)不同的缓冲区、着色器程序等)而不是深度排序。 如果你用一个已经绑定(bind)的缓冲区
该程序是使用 SDL2 和 openGL 用 C 语言编写的。只要我注释掉 //glUseProgram(0); 程序编译运行并显示glCleared颜色。包括 gl 版本检查: const char
我正在尝试将一些 openGL 处理转移到 C++ 类中,该类包装在 Objective-C 类中以用于 iOS。它的大部分似乎都有效,但我没有将渲染结果放入帧缓冲区。当我用 glGetError()
我正尝试按照 https://open.gl/drawing 上的示例学习 openGL 3.0 (它只是在屏幕上绘制一个彩色矩形)。 我在 VS2015 社区中使用 SDL2.0.5 和 glew
我是一名优秀的程序员,十分优秀!