c++ - 使用 OpenGL ES glDrawElements 绘制正方形不起作用
问题描述
我正在尝试使用以下代码在 Android 上绘制一个正方形:
void drawSquare()
{
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
GLfloat vertices[] =
{
-0.5f, -0.5f,
0.5f, -0.5f,
0.5f, 0.5f,
-0.5f, 0.5f
};
GLubyte indices[] = { 0, 1, 2, 3 };
glVertexPointer(2, GL_FLOAT, 0, vertices);
glDrawElements(GL_TRIANGLES, 4, GL_UNSIGNED_BYTE, indices);
}
之前,我调用上述方法设置显示,如下所示:
bool initDisplay()
{
const EGLint attribs[] =
{
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
EGL_BLUE_SIZE, 8,
EGL_GREEN_SIZE, 8,
EGL_RED_SIZE, 8,
EGL_NONE
};
EGLint format;
EGLint numConfigs;
EGLConfig config;
EGLDisplay mDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
eglInitialize(mDisplay, 0, 0);
eglChooseConfig(mDisplay, attribs, &config, 1, &numConfigs);
eglGetConfigAttrib(mDisplay, config, EGL_NATIVE_VISUAL_ID, &format);
ANativeWindow_setBuffersGeometry(mApp->window, 0, 0, format);
EGLSurface mSurface = eglCreateWindowSurface(mDisplay, config, mApp->window, NULL);
EGLContext mContext = eglCreateContext(mDisplay, config, NULL, NULL);
eglMakeCurrent(mDisplay, mSurface, mSurface, mContext);
eglQuerySurface(mDisplay, mSurface, EGL_WIDTH, &mWidth);
eglQuerySurface(mDisplay, mSurface, EGL_HEIGHT, &mHeight);
return true;
}
并像这样设置OpenGL:
bool initGL()
{
glDisable(GL_DITHER);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
glClearColor(0.f, 0.f, 0.f, 1.0f);
glShadeModel(GL_SMOOTH);
glViewport(0, 0, mWidth, mHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
return true;
}
但是,我看不到屏幕上的正方形。只看到黑屏。在此先感谢您的帮助。
解决方案
指数
GLubyte indices[] = { 0, 1, 2, 3 };
不要指定三角形Primitive。指定一个四边形。GL_QUADS
分别使用原始类型GL_TRIANGLE_FAN
:
GLubyte indices[] = { 0, 1, 2, 3 };
glVertexPointer(2, GL_FLOAT, 0, vertices);
glDrawElements(GL_TRIANGLE_FAN, 4, GL_UNSIGNED_BYTE, indices);
或由 2 个具有索引 (0 - 1 - 2) 和 (0 - 2 - 3) 的三角形组成正方形:
3 2
+------+ +
| / / |
| / / |
| / / |
+ +-------+
0 1
GLubyte indices[] = { 0, 1, 2, 0, 2, 3 };
glVertexPointer(2, GL_FLOAT, 0, vertices);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, indices);
推荐阅读
- c# - 转换xml字符串不同的对象
- python-2.7 - 使用 Python 请求上传大于 12k 的文件在 Ubuntu 上不起作用
- docker - docker run 和 docker 容器运行的区别
- android - 单击 textInput 时 React Native 致命崩溃
- selenium - XPath 索引选择器返回整个数组,而不是索引处的元素
- kubernetes - 使用 kubectl 在 pod 中执行 bash 命令?
- yii2 - SQLSTATE[HY000] [1130] 不允许主机 'xxx' 连接到此 MariaDB 服务器
- android - RecyclerView OnClick 在其他位置更改项目
- sql-server - SSIS错误将Excel工作表加载到表格 - OLEDB错误
- solr - 使用 facet.field 调试 Solr 查询显示多于查询结果的文档的方面结果