- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正尝试按照 https://open.gl/drawing 上的示例学习 openGL 3.0 (它只是在屏幕上绘制一个彩色矩形)。
我在 VS2015 社区中使用 SDL2.0.5 和 glew 2.0.0,它在我运行 Win7 pro x64 的 i5 skylake HD4000 笔记本电脑上完美运行。但是,当我在同一台笔记本电脑(双启动 Win 和 Linux)上使用 gcc 和 glew 2.0.0 在 Ubuntu Gnome 17.04 x64 上编译完全相同的源代码时,我在 glUseProgram 处收到一个
.GL_INVALID_OPERATION 1282
错误(shaderProgram)
编译器运行时没有警告:
g++ main.cpp -Wall -I/usr/include/SDL2 -lGL -lGLEW -lSDL2 -lSDL2_image -lSDL2_mixer -o game
此函数之前没有错误,(为了清楚起见,我删除了错误检查代码)。
此外,屏幕从正常桌面变为空白黑屏,然后重复,直到我退出应用程序。如果我注释掉 SDL_GL_SwapWindow(gameWindow)
,屏幕消隐不会发生,但错误仍然存在。
我尝试将上下文更改为 3.3 并将着色器版本更改为#version 330 核心 - 同样的问题。
我还使用了英特尔显卡更新工具来获取最新的驱动程序。
下面是一些系统信息:
product: Intel(R) Core(TM) i5-3340M CPU @ 2.70GHz
vendor: Intel Corp.
physical id: 1
bus info: cpu@0
size: 3199MHz
capacity: 3400MHz
width: 64 bits
capabilities: fpu fpu_exception wp vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp x86-64 constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm epb tpr_shadow vnmi flexpriority ept vpid fsgsbase smep erms xsaveopt dtherm ida arat pln pts cpufreq
description: VGA compatible controller
product: 3rd Gen Core processor Graphics Controller
vendor: Intel Corporation
physical id: 2
bus info: pci@0000:00:02.0
version: 09
width: 64 bits
clock: 33MHz
capabilities: msi pm vga_controller bus_master cap_list rom
configuration: driver=i915 latency=0
resources: irq:29 memory:f6400000-f67fffff memory:e0000000-efffffff ioport:f000(size=64) memory:c0000-dffff
OpenGL vendor string: Intel Open Source Technology Center
OpenGL renderer string: Mesa DRI Intel(R) Ivybridge Mobile
OpenGL core profile version string: 3.3 (Core Profile) Mesa 17.0.3
OpenGL core profile shading language version string: 3.30
OpenGL core profile context flags: (none)
OpenGL core profile profile mask: core profile
OpenGL core profile extensions:
OpenGL version string: 3.0 Mesa 17.0.3
OpenGL shading language version string: 1.30
OpenGL context flags: (none)
OpenGL extensions:
OpenGL ES profile version string: OpenGL ES 3.0 Mesa 17.0.3
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.00
OpenGL ES profile extensions:
源代码:
#define GLEW_STATIC
#include <GL/glew.h>
#include <SDL.h>
#include <SDL_opengl.h>
#include <iostream>
// SDL2 global pointers
SDL_Window* gameWindow = NULL;
SDL_GLContext context = NULL;
SDL_Surface* screenSurface = NULL;
SDL_Renderer* gameRenderer = NULL;
// Shader sources
const GLchar* vertexSource = R"glsl(
#version 150 core
in vec2 position;
in vec3 color;
out vec3 Color;
void main()
{
Color = color;
gl_Position = vec4(position, 0.0, 1.0);
}
)glsl";
const GLchar* fragmentSource = R"glsl(
#version 150 core
in vec3 Color;
out vec4 outColor;
void main()
{
outColor = vec4(Color, 1.0);
}
)glsl";
int main(int argc, char *argv[])
{
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8);
if(SDL_Init(SDL_INIT_EVERYTHING) != 0)
{
printf("SDL_Init failed! Error: %s\n", SDL_GetError());
return -1;
}
else printf("SDL_Init OK.\n");
gameWindow = SDL_CreateWindow("OpenGL", 100, 100, 400, 300, SDL_WINDOW_OPENGL);
if (gameWindow == NULL)
{
printf("SDL_CreateWindow failed! Error: %s\n", SDL_GetError());
SDL_Delay(1000);
SDL_Quit();
return -1;
}
else printf("SDL_CreateWindow OK.\n");
context = SDL_GL_CreateContext(gameWindow);
if(context == NULL)
{
printf("SDL_CreateWindow failed! Error: %s\n", SDL_GetError());
SDL_Delay(1000);
SDL_DestroyWindow(gameWindow);
SDL_Quit();
return -1;
}
else printf("SDL_GL_CreateContext OK.\n");
glewExperimental=GL_TRUE;
GLenum glew_init_error = glewInit();
if (GLEW_OK != glew_init_error)
{
fprintf(stderr, "glewInit failed! Error: %s\n", glewGetErrorString(glew_init_error));
SDL_Delay(1000);
SDL_GL_DeleteContext(context);
SDL_DestroyWindow(gameWindow);
SDL_Quit();
return -1;
}
else fprintf(stdout, "glewInit OK. Version: %s\n", glewGetString(GLEW_VERSION));
// Create Vertex Array Object
GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
// Create a Vertex Buffer Object and copy the vertex data to it
GLuint vbo;
glGenBuffers(1, &vbo);
GLfloat vertices[] = {
-0.5f, 0.5f, 1.0f, 0.0f, 0.0f, // Top-left
0.5f, 0.5f, 0.0f, 1.0f, 0.0f, // Top-right
0.5f, -0.5f, 0.0f, 0.0f, 1.0f, // Bottom-right
-0.5f, -0.5f, 1.0f, 1.0f, 1.0f // Bottom-left
};
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
// Create an element array
GLuint ebo;
glGenBuffers(1, &ebo);
GLuint elements[] = {
0, 1, 2,
2, 3, 0
};
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(elements), elements, GL_STATIC_DRAW);
// Create and compile the vertex shader
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, &vertexSource, NULL);
glCompileShader(vertexShader);
// Create and compile the fragment shader
GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &fragmentSource, NULL);
glCompileShader(fragmentShader);
// Link the vertex and fragment shader into a shader program
GLuint shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glBindFragDataLocation(shaderProgram, 0, "outColor");
glLinkProgram(shaderProgram);
// ************** THE NEXT FUNCTION CALL FAILS WITH GL_INVALID_OPERATION *********************************
glUseProgram(shaderProgram);
// Specify the layout of the vertex data
GLint posAttrib = glGetAttribLocation(shaderProgram, "position");
glEnableVertexAttribArray(posAttrib);
glVertexAttribPointer(posAttrib, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), 0);
GLint colAttrib = glGetAttribLocation(shaderProgram, "color");
glEnableVertexAttribArray(colAttrib);
glVertexAttribPointer(colAttrib, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), (void*)(2 * sizeof(GLfloat)));
SDL_Event windowEvent;
while (true)
{
if (SDL_PollEvent(&windowEvent))
{
if (windowEvent.type == SDL_QUIT) break;
if (windowEvent.type == SDL_KEYUP && windowEvent.key.keysym.sym == SDLK_ESCAPE) break;
}
// Clear the screen to black
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// Draw a rectangle from the 2 triangles using 6 indices
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
SDL_GL_SwapWindow(gameWindow);
}
glDeleteProgram(shaderProgram);
glDeleteShader(fragmentShader);
glDeleteShader(vertexShader);
glDeleteBuffers(1, &ebo);
glDeleteBuffers(1, &vbo);
glDeleteVertexArrays(1, &vao);
SDL_GL_DeleteContext(context);
SDL_Delay(1000);
SDL_Quit();
return 0;
}
最佳答案
检查着色器是否通过 glGetShaderiv/InfoLog 和 glGetProgramiv/InfoLog 编译链接成功 – pleluron
感谢 Pleluron,我添加了着色器和链接器错误日志代码,并发现在我的核心 i5 HD4000 Linux 上,GPU 驱动程序不支持我正在使用的 1.5 (#version 150) 着色器版本。当我将顶点和片段着色器版本更改为 1.3 (#version 130) 并将主要/次要 SDL 上下文属性更改为 3.0 时,它解决了问题。 (虽然我确实必须修改 GL3.0/GLSL1.3 的着色器代码)。
让我感到困惑的是 glxinfo 在下面报告了 OpenGL3.3 和 GLSL 3.3,所以我希望能够准确地使用...
OpenGL vendor string: Intel Open Source Technology Center
OpenGL renderer string: Mesa DRI Intel(R) Ivybridge Mobile
OpenGL core profile version string: 3.3 (Core Profile) Mesa 17.0.3
OpenGL core profile shading language version string: 3.30
OpenGL core profile context flags: (none)
OpenGL core profile profile mask: core profile
OpenGL core profile extensions:
...但还在下面报告了 OpenGL 3.0 和 GLSL 1.30,这似乎是通过 SDL 创建上下文时使用的版本,尽管被要求提供更高版本?
OpenGL version string: 3.0 Mesa 17.0.3
OpenGL shading language version string: 1.30
OpenGL context flags: (none)
我将深入研究并更新此答案。
关于linux - glUseProgram() GL_INVALID_OPERATION 1282 在 Ubuntu Gnome 17.04 Intel HD4000 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45384012/
我认为(我不确定),每当我们调用 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
我是一名优秀的程序员,十分优秀!