Jon*_*tte 13 linux opengl-es xorg opengl-es-2.0
我在X86的x86 Linux上寻找C++(或C)的GLES2样本的良好来源.我可以找到的样本都是针对iOS的Objective C,或针对Android的Java,或针对WebGL的JavaScript.Kronos网站有一个"教程"部分,其中包含两行"我们的教程索引将在此处".鉴于GLES2已有5年历史,我对那里的内容突然激增并不抱太大希望.
我已经非常了解OpenGL了.我真的想要一些方便的复制粘贴上下文设置代码源.我在哪里可以找到类似的东西?
GLFW,Mesa,Ubuntu 16.04 AMD64
我不确定GLUT是否支持GLES,但GLFW确实支持GLES ,大大简化了窗口管理.
sudo apt-get install libglfw3-dev libgles2-mesa-dev
gcc glfw_triangle.c -lGLESv2 -lglfw
Run Code Online (Sandbox Code Playgroud)
输出:

资源:
#include <stdio.h>
#include <stdlib.h>
#define GLFW_INCLUDE_ES2
#include <GLFW/glfw3.h>
static const GLuint WIDTH = 800;
static const GLuint HEIGHT = 600;
static const GLchar* vertex_shader_source =
"#version 100\n"
"attribute vec3 position;\n"
"void main() {\n"
" gl_Position = vec4(position, 1.0);\n"
"}\n";
static const GLchar* fragment_shader_source =
"#version 100\n"
"void main() {\n"
" gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n"
"}\n";
static const GLfloat vertices[] = {
0.0f, 0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
-0.5f, -0.5f, 0.0f,
};
GLint common_get_shader_program(const char *vertex_shader_source, const char *fragment_shader_source) {
enum Consts {INFOLOG_LEN = 512};
GLchar infoLog[INFOLOG_LEN];
GLint fragment_shader;
GLint shader_program;
GLint success;
GLint vertex_shader;
/* Vertex shader */
vertex_shader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertex_shader, 1, &vertex_shader_source, NULL);
glCompileShader(vertex_shader);
glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &success);
if (!success) {
glGetShaderInfoLog(vertex_shader, INFOLOG_LEN, NULL, infoLog);
printf("ERROR::SHADER::VERTEX::COMPILATION_FAILED\n%s\n", infoLog);
}
/* Fragment shader */
fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragment_shader, 1, &fragment_shader_source, NULL);
glCompileShader(fragment_shader);
glGetShaderiv(fragment_shader, GL_COMPILE_STATUS, &success);
if (!success) {
glGetShaderInfoLog(fragment_shader, INFOLOG_LEN, NULL, infoLog);
printf("ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n%s\n", infoLog);
}
/* Link shaders */
shader_program = glCreateProgram();
glAttachShader(shader_program, vertex_shader);
glAttachShader(shader_program, fragment_shader);
glLinkProgram(shader_program);
glGetProgramiv(shader_program, GL_LINK_STATUS, &success);
if (!success) {
glGetProgramInfoLog(shader_program, INFOLOG_LEN, NULL, infoLog);
printf("ERROR::SHADER::PROGRAM::LINKING_FAILED\n%s\n", infoLog);
}
glDeleteShader(vertex_shader);
glDeleteShader(fragment_shader);
return shader_program;
}
int main(void) {
GLuint shader_program, vbo;
GLint pos;
GLFWwindow* window;
glfwInit();
glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_ES_API);
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
window = glfwCreateWindow(WIDTH, HEIGHT, __FILE__, NULL, NULL);
glfwMakeContextCurrent(window);
printf("GL_VERSION : %s\n", glGetString(GL_VERSION) );
printf("GL_RENDERER : %s\n", glGetString(GL_RENDERER) );
shader_program = common_get_shader_program(vertex_shader_source, fragment_shader_source);
pos = glGetAttribLocation(shader_program, "position");
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glViewport(0, 0, WIDTH, HEIGHT);
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glVertexAttribPointer(pos, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0);
glEnableVertexAttribArray(pos);
glBindBuffer(GL_ARRAY_BUFFER, 0);
while (!glfwWindowShouldClose(window)) {
glfwPollEvents();
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(shader_program);
glDrawArrays(GL_TRIANGLES, 0, 3);
glfwSwapBuffers(window);
}
glDeleteBuffers(1, &vbo);
glfwTerminate();
return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
关键的代码行是:
#define GLFW_INCLUDE_ES2
#include <GLFW/glfw3.h>
Run Code Online (Sandbox Code Playgroud)
GLFW_INCLUDE_ES2记录在以下网址:http://www.glfw.org/docs/latest/build_guide.html#build_macros,快速查看来源显示它转发给GLES:
#elif defined(GLFW_INCLUDE_ES2)
#include <GLES2/gl2.h>
#if defined(GLFW_INCLUDE_GLEXT)
#include <GLES2/gl2ext.h>
#endif
Run Code Online (Sandbox Code Playgroud)
这个源似乎是GLES和OpenGL的常见子集(就像很多GLES一样),并且-lGL如果我们删除了它,也可以编译#define GLFW_INCLUDE_ES2.
如果我们添加不像GLES那样立即呈现的内容glBegin,则链接会按预期失败.
另请参见:如何在Linux上开发OpenGL ES(GLES)2.0应用程序?
致谢:genpfult使代码更加正确.
ARM Mali OpenGL ES SDK

包含几个有趣的开源示例+窗口系统样板(X11 + EGL).
构建系统支持ARM/Mali SoC的简单交叉编译,但我还没有测试过.
包含的关键组件似乎是"OpenGL ES Emulator" http://malideveloper.arm.com/resources/tools/opengl-es-emulator/,它"将OpenGL ES 3.2 API调用映射到OpenGL API".但是这不包含源代码,只是预编译.
使用看似宽容的定制企业EULA,但是,请问你的律师.
在SDK v2.4.4上测试.
| 归档时间: |
|
| 查看次数: |
12098 次 |
| 最近记录: |