- 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/
我知道您可以为 Zune 编写应用程序,但是 Zune HD 怎么样? 最佳答案 答案: http://coolthingoftheday.blogspot.com/2009/09/xna-game-
我期待使用 grep 命令从 top 命令中提取磁盘内存使用情况,并将其保存到 bash 解释器可用的变量中。 最佳答案 ...我假设您未能从 top 的输出中 grep 那些部分而不理解为什么...
我读到了 point/pixels苹果文档中的一些内容,但我仍然不完全清楚。我试图完成的是将工具栏放置在触摸 TextView 时出现的键盘上方。在 IOS4 之前,它的工作方式是将工具栏放置在位置
我使用 Locale.getDefault.getDisplayLanauge() 来获取语言代码,但我得到的是“hd”。我不知道那是什么。我想应该是“en”。 谁能告诉我为什么它默认为“高清”,它是
编辑:按照第一个答案,我更深入地研究了stackoverflow,并将问题重新表述为°如何仅使用高清文件?”并发现:How do I stop Cocos2D from requiring stand
根据Delphi XE2的发行说明。 FireMonkey可以创建高清应用程序。 HD 代表高清晰度。为什么是高清? VCL应用程序不能像FireMonkey一样创建高清应用程序吗? 最佳答案 这是d
我想从YouTube的网址下载视频。我使用pytube,但它仅下载低分辨率视频或高分辨率而没有音频。如何在python中从youtube下载带有音频的高分辨率视频?谢谢 最佳答案 我怀疑您是在谈论这个
我最近一直在Hive的PHD VM上运行一些基本脚本。 下面的大多数内容在我之前使用的apache发行版上都可以正常工作,但是现在在PHD版本上,where,sum,group by或基本上任何操作都
我正在尝试运行一种曾经可以运行但无法成功运行的最简单的OpenGL 3.3程序。程序始终以负整数返回。 这就是我遇到这种情况的方法。除了遵循本指南LearnOpenGL - Creating a wi
我已经构建并部署了由 zune hd 的新项目模板创建的应用程序。问题是每当应用程序退出时,Zune 就会重新启动。从 PC 远程调试或直接从设备运行时会发生这种情况。它发生在 Debug模式和 Re
在我的ryzen 3 2200g上的Vega 8 iGPU上,此着色器似乎可以正常编译,但同一片段着色器在intel hd 4000图形上无法编译。确实存在着色器错误或我做错了吗?我还采取了一些步骤,
我正在用 cocos2d 制作游戏。我正在检查 Sprite 的级别并相应地更新纹理。现在开始时图像是高清的。现在当游戏开始并且我开始移动 Sprite 时,高清图像被普通图像取代。我正在检查用这段代
我正在开发一个 C++ 应用程序(在 Linux 机器上运行),它非常注重读取日志文件并将派生结果写入磁盘。我想知道哪些是优化此类应用程序的最佳实践: 哪些操作系统调整可以提高性能? 哪些编程模式可以
无法在“Macintosh HD”上安装 Xcode,因为需要 macOS 10.12.6 或更高版本。我的 macitosh 版本是 10.12,但是当我搜索更新时它询问没有可用的更新 最佳答案 需
我正在尝试编写我的第一个 firemonkey - HD 应用程序 创建 firemonkey - HD 应用程序 在表单上放置一个 TLabel 并更改其名称。 选择 TLabel 在下拉菜单中选择
将文件存储在本地存储中与存储在 Azure 虚拟机 HD(如 d:\或 e:)上有区别吗?据我了解,它们是相同的。 谢谢 最佳答案 不知道为什么要将本地存储与 Azure 虚拟机的 HD 进行比较,因
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我的应用程序通过在我的请求的 hd 参数中指定 abc.com,将 Oauth2 的登录限制为特定域,例如 abc.com。 Restrict Login Email with Google OAut
我有一个 Android 应用程序可以创建本地 HTML 文件,然后在浏览器中将其显示给用户。我遇到过 BrowserActivity 无法在不同设备上运行的问题,具体取决于安装的浏览器。我当前的代码
我有一个可在第一代 iPad 上运行的应用程序。这是一款使用cocos2d框架制作的游戏。 第一台 iPad 确实有 256mb 内存,并且使用仪器(内存监控工具)我能够确定该应用程序在设备上的大约
我是一名优秀的程序员,十分优秀!