VBO、Shader C++ Android 混淆

Posted

技术标签:

【中文标题】VBO、Shader C++ Android 混淆【英文标题】:VBO, Shader C++ Android Confusion 【发布时间】:2016-02-22 21:17:58 【问题描述】:

我无法理解在哪里/如何在 VS 2015 中为原生 android 应用程序设置缓冲区。如果这不是提问的最佳方式,我深表歉意。我感谢任何帮助/见解。

这是我目前所拥有的: (在 engine_init_display 中)

GLint vShaderLength = vertex_shader.length();
const GLchar* vcode = vertex_shader.c_str();

GLint fShaderLength = fragment_shader.length();
const GLchar* fcode = fragment_shader.c_str();

GLuint vs = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vs, 1, &vcode, NULL);
glCompileShader(vs);

GLuint fs = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fs, 1, &fcode, NULL);
glCompileShader(fs);

shader_programme = glCreateProgram();
glAttachShader(shader_programme, fs);
glAttachShader(shader_programme, vs);

glLinkProgram(shader_programme);

GLint pos_id = glGetAttribLocation(shader_programme, "position");

//Set vertex data
glUseProgram(shader_programme);

glVertexAttribPointer(pos_id, 0, GL_FLOAT, GL_FALSE, 0, 0);

glVertexAttribPointer(pos_id, //GLuint
    3,    //GLint size
    GL_FLOAT,                             //GLenum type
    GL_FALSE,                             //GLboolean
    (sizeof(float) * 5),            //GLsizei stride
    points             //const GLvoid *pointer
    );


glEnableVertexAttribArray(pos_id);

(在 engine_draw_frame 中)

glClearColor(1.0f, 0.41f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices);

eglSwapBuffers(engine->display, engine->surface);

有了这个,我得到一个粉红色(清晰的颜色)背景。我不确定我做错了什么。

这是我的顶点数据和着色器

float points[] =

-0.2f, 0.6f, 0.0f,
0.0f, 1.0f,
0.5f, 0.5f, 0.0f,
1.0f, 1.0f,
-0.5f, -0.5f, 0.0f,
0.0f, 0.0f,
0.5f, -0.5f, 0.0f,
1.0f, 0.0f
;

unsigned short indices[] =

0,  2,  1,  2,  3,  1
;

std::string vertex_shader =
"#version 300 es         \n"
"in vec3 position;        \n"
"void main ()             \n"
"  gl_Position = vec4 (position, 1.0); \n"
" \n";

std::string fragment_shader =
"#version 300 es    \n"
"precision highp float; \n"
"out vec4 frag_colour; \n"
"void main ()         \n"
"  frag_colour = vec4 (0.5, 0.0, 0.5, 1.0); \n"
"   \n";

【问题讨论】:

【参考方案1】:

好的,我想通了。我的着色器或顶点数组没有任何问题。问题是我没有指定 EGL 来使用 EGL_CONTEXT_CLIENT_VERSION 创建 OpenGLES2 上下文。

在此处查看 -> Khronos Specification,第 43 页(pdf)了解更多信息

规格样本:

EGLContext eglCreateContext(EGLDisplay dpy,
          EGLConfig config, EGLContext share_context,
          const EGLint *attrib_list);

如果 *attrib_list 为空,则默认为 OpenGLES1,着色器将无法在该上下文中工作。

所以,您需要做的是创建一个属性列表。大致如下:

EGLint contextAttributes[]=

    EGL_CONTEXT_CLIENT_VERSION,2,
    EGL_NONE

并将其传递给创建上下文

p_context = eglCreateContext(display, config, NULL, contextAttributes);

基本上,我太不确定自己在顶点缓冲区方面的能力,所以很长时间以来一直专注于此。

【讨论】:

以上是关于VBO、Shader C++ Android 混淆的主要内容,如果未能解决你的问题,请参考以下文章

系列四:Sprite 我爱精灵,我爱VBO

OpenGL:VAO/VBO 混淆

iOS OpenGL ES 2.0 VBO 混淆

在 GLSL 着色器中访问 VBO/VAO 数据

Cesium原理篇:6 Render模块(3: Shader)

C++ 删除不可见的面孔 VBO