- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我目前正在学习 OpenGL 3.X,正在使用 ubuntu 14.04。我正在使用 C 语言创建我的应用程序和 SDL2 库。
命令
glxinfo | grep "OpenGL version"
给我以下输出
OpenGL version string: 3.0 Mesa 10.1.3
我的着色器创建有问题,这里是加载/编译/链接着色器的代码:
typedef struct s_shader
{
GLuint vertex_id;
GLuint fragment_id;
GLuint program_id;
} t_shader;
t_shader *create_shader(const char *vertex_file, const char *fragment_file)
{
t_shader *new_shader;
new_shader = (t_shader *)malloc(sizeof(t_shader));
if (new_shader)
{
new_shader->vertex_id = glCreateShader(GL_VERTEX_SHADER);
new_shader->fragment_id = glCreateShader(GL_FRAGMENT_SHADER);
new_shader->program_id = glCreateProgram();
load_shader(new_shader, vertex_file, fragment_file);
glCompileShader(new_shader->vertex_id);
glCompileShader(new_shader->fragment_id);
glAttachShader(new_shader->program_id, new_shader->vertex_id);
glAttachShader(new_shader->program_id, new_shader->fragment_id);
glLinkProgram(new_shader->program_id);
}
return (new_shader);
}
void load_shader(t_shader *shader,const char *vertex_file,const char *fragment_file)
{
char *vertex_file_content;
char *fragment_file_content;
int vertex_len;
int fragment_len;
vertex_file_content = NULL;
fragment_file_content = NULL;
vertex_file_content = get_file_content(vertex_file);
fragment_file_content = get_file_content(fragment_file);
vertex_len = strlen(vertex_file_content);
fragment_len = strlen(fragment_file_content);
glShaderSource(shader->vertex_id, 1, (const GLchar **)&vertex_file_content, &vertex_len);
glShaderSource(shader->fragment_id, 1, (const GLchar **)&fragment_file_content, &fragment_len);
}
我在每次 gl 调用后使用 glGetError(),我得到的第一个错误代码是 glLinkProgram() 调用,它给我一个 GL_INVALID_OPERATION(错误 1282)。我尝试像这样输出日志错误:
GLchar buff[1024];
GLsizei length;
glGetProgramInfoLog(new_shader->program_id, 1024, &length, buff);
printf("length:%i\nlog:'%s'\n", length, buff);
但是日志是空的。
我对片段和顶点着色器都使用了 glIsShader(),它返回 GL_TRUE。我还在 glCompileShader() 之后使用了 glGetShaderInfoLog() 并且片段和顶点着色器的日志都是空的。我在文档中读到:
GL_INVALID_OPERATION is generated if program is not a program object.
GL_INVALID_OPERATION is generated if program is the currently active program object and transform feedback mode is active.
我的程序似乎是一个程序对象,因为 glCreateProgram 返回一个非空值。此时在代码中,没有事件的程序对象。
窗口和 OpenGL 上下文:
SDL_Init(SDL_INIT_VIDEO);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
window = SDL_CreateWindow("My OpenGl", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN);
if (window)
{
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
gl_context = SDL_GL_CreateContext(window);
读取文件内容的函数如下:
char *get_file_content(const char *file_name)
{
FILE *file;
char *file_content;
long file_size;
file = NULL;
file_content = NULL;
file_size = 0;
file = fopen(file_name, "r");
if (file)
{
fseek(file, 0, SEEK_END);
file_size = ftell(file);
fseek(file, 0, SEEK_SET);
file_content = (char *)malloc(sizeof(char) * file_size + 1);
if (file_content)
{
memset(file_content, '\0', file_size);
fread(file_content, sizeof(char), file_size, file);
file_content[file_size + 1] = '\0';
}
fclose(file);
}
return (file_content);
}
片段着色器源代码:
#version 150 core
in vec3 color;
out vec4 out_Color;
void main()
{
out_Color = vec4(1.0f, 1.0f, 1.0f, 1.0);
}
顶点着色器源代码:
#version 150 core
in vec3 in_Vertex;
in vec3 in_Color;
uniform mat4 projection;
uniform mat4 modelview;
out vec3 color;
void main()
{
gl_Position = projection * modelview * vec4(in_Vertex, 1.0);
color = in_Color;
}
还有其他调试glLinkProgram的方法吗?
最佳答案
您的着色器可能无法编译,因为您正尝试在 OpenGL 3.0 上下文中使用 GLSL #version 150
(与 OpenGL 3.2 一起引入)。
由于您使用的是 mesa,您的 GPU 很可能实际上支持 3.2 或更高版本。但是在 mesa 上,您必须使用 core 配置文件才能访问 OpenGL >= 3.2 上下文。否则,mesa 将仅限于 GL 3.0,而这正是您所得到的。
所以你有两个选择:
将着色器降级到 #version 130
。使用您发布的着色器,我没有看到任何不适用于该版本的内容,因此只需调整 #version
指令就足够了。
将您的上下文升级到现代 GL 3.2 核心配置文件。由于您使用的是 SDL2,相关函数是 SDL_GL_SetAttribute()
,另见 the SDL_GLprofile
documentation .使用核心配置文件意味着所有已弃用的功能都不再可用。您没有发布您的代码,因此不清楚是否依赖于已弃用的功能。
虽然备选方案 1 可能看起来更简单,但我强烈建议选择变体 2。如果您现在正在学习 GL,则应该学习新方法,而不是十多年前已弃用的方法。
关于无法链接程序,glLinkProgram() 给我 GL_INVALID_OPERATION,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31639760/
每次我尝试使用 Qt QOpenGLTexture 上传具有多个 mipmap 级别的 DXT1 纹理时,我都会收到 GL_INVALID_OPERATION。对于 mipmap 级别 0,一切正常,
我正在使用 this lovely tutorial. 进行阴影转换这个过程是,我们将场景渲染到一个帧缓冲区,附加到它的是一个立方体贴图来保存深度值。然后,我们将这个立方体贴图传递给片段着色器,片段着
为什么是glTexSubImage2D()突然导致 GL_INVALID_OPERATION? 我正在尝试将我过时的增强现实应用程序从 iOS4.x 升级到 iOS5.x,但我遇到了困难。我运行的是
我将 OpenGL 与 LWJGL 和我自己的非常小的框架一起用于琐碎的任务。我正在关注OpenGL SuperBible: Comprehensive Tutorial and Reference
我正在开发一些图形应用程序,在 glPopAttrib() 之后我得到了一个 GL_INVALID_OPERATION。预测答案“您似乎在 glBegin/glEnd block 中调用了 glPop
我正在尝试从已有效编译和链接的程序中检索二进制文件。我已经通过 GL_PROGRAM_BINARY_LENGTH 收到了它的长度。该文档说有两个实例可能会发生 GL_INVALID_OPERATION
当我尝试为 gound 分配几何图形时,我在示例的最开始遇到异常,here和 here : 此时 gl4.glNamedBufferData(vertexBuffer[0], Vertex.size(
我已将错误范围缩小到此 OpenGL 调用: glVertexAttribPointer(var.vertex, 4, GL_FLOAT, GL_FALSE, 0, 0); 前面没有错误,后面有 GL
我当前正在连接 OpenGL 应用程序并收到GL_INVALID_OPERATION。整个 GL 分散在多个文件中,很难从中创建示例,但我已经使用 apitrace 创建了 OpenGL 跟踪。这是造
我正在浏览 OGLdev教程,而且我一直坚持让顶点数组对象工作。相关代码如下: glBindBuffer(GL_ARRAY_BUFFER, buffers[POS_VB]); FloatBuffer
我有两个具有 TextureView 的 fragment 来显示相机预览或播放视频。 在使用应用程序一段时间后,玩弄屏幕,我在 logcat 中收到此错误 OpenGLRenderer﹕ GL_IN
嘿,我有一个抽象所有与着色器相关的类,名为 Shader.cpp : #include "Shader.h" #include "Renderer.h" #include #include Sha
我目前正在研究阴影贴图。我找到了 Paul 的项目 http://www.paulsprojects.net/tutorials/smt/smt.html ,我目前正在尝试实现这一点。但我无法获得合适
当我在下面的代码中调用 glUniformMatrix4fv 或 glUniform4fv 时,它每次都会引发 GL_INVALID_OPERATION,我尝试更改我传递矩阵数据的方式,我传递 id
我正在使用 OpenGL 核心配置文件 3.3 版 当我调用 glVertexAttribPointer 时,我得到 GL_INVALID_OPERATION。我已经 checkout http://
我目前正在学习 OpenGL 3.X,正在使用 ubuntu 14.04。我正在使用 C 语言创建我的应用程序和 SDL2 库。 命令 glxinfo | grep "OpenGL version"
我的目标是让实例化渲染工作,但即使是单个 glDrawElements 现在也会失败。注意:此代码已在 Windows 上运行。然而在 OS X 上它失败了 GL_INVALID_OPERATION
这是我的(包装的)OpenGL 调用,它导致 GL_INVALID_OPERATION: GLTextures.TexImage2D(TexImage2DTarget.TEXTURE_2D, 0, T
我试图让 OpenGL ES 2.0 在 Windows 7 上使用(Google 的)Angle 运行,但是无论我把它放在哪里,glGetError() 都会无限返回 GL_INVALID_OPER
我正在尝试找出模板。现在我只是用模板值绘制一些框,然后读取值。每次我用 GL_STENCIL_INDEX 调用 glReadPixels 时,我都会得到 GL_INVALID_OPERATION。这是
我是一名优秀的程序员,十分优秀!