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 混淆的主要内容,如果未能解决你的问题,请参考以下文章