我在C++中有一些简单的OpenGL ES代码,我在运行Android的手机,运行webOS的手机和使用SDL/OpenGL的Mac上运行.有问题的代码只是绘制了一个GL_LINE_STRIP存储在GLfloats 数组中的代码.以下是我尝试这样做的方法(版本1):
GLfloat array* = new GLfloat[2048];
//later... (array gets filled)
int howMany = 1024;
glVertexPointer(2, GL_FLOAT, 0, array); checkError();
glDrawArrays(GL_LINE_STRIP, 0, howMany); checkError();
Run Code Online (Sandbox Code Playgroud)
似乎它应该非常简单.但是,上面的代码段落在Android和我的Mac上的OpenGL驱动程序中(无论出于何种原因,似乎在webOS上运行正常.)这是我要做的就是避免这种情况(版本2):
GLfloat array* = new GLfloat[2048];
//later... (array gets filled)
int howMany = 1024;
for (unsigned i = 0; i < howMany; i += 789) {
glVertexPointer(2, GL_FLOAT, 0, array+i*2); checkError();
//this is not a bug: we draw one more than we increment by, or there is …Run Code Online (Sandbox Code Playgroud) 我被要求为我们的Android引擎创建着色器,我有点困惑.到目前为止,引擎的构建基于这样一个前提:我们使用GL10实例来负责绘制所有内容.但是因为着色器是OpenGL 2.0,如果我将上下文客户端版本设置为2.0并绘制一个简单的场景(比如一个立方体),则不会出现任何内容,而如果我使用默认的1.0则会出现.
我不完全确定应该如何继续 - 我是否需要根据设备支持的最高级别的OpenGLES创建不同的引擎?无论它支持什么,都可以使用最高版本(假设向后兼容性)?
任何帮助/建议表示赞赏......
我正在尝试将我的GLSurfaceView设置为使用传统的2D坐标系.基本上,我想把我的第一个磁贴放在0x0,它位于左上角.但是,当我在0x0处绘制纹理时,它会在左下角绘制它.
我希望它从0x0开始并随着Y坐标的增加而下降.
这是我如何初始化我的渲染器:
gl.glClearColor(0f, 0f, 0f, 1);
gl.glViewport(0, 0, mViewWidth,mViewHeight);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
GLU.gluOrtho2D(gl, 0, mViewWidth, mViewHeight, 0);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
gl.glEnable(GL10.GL_BLEND);
gl.glDisable(GL10.GL_DEPTH_TEST);
gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
gl.glShadeModel(GL10.GL_FLAT);
gl.glEnable(GL10.GL_TEXTURE_2D);
Run Code Online (Sandbox Code Playgroud)
我使用以下方法绘制纹理:
gl.glBindTexture(GL10.GL_TEXTURE_2D, mytexture);
((GL11Ext) gl).glDrawTexfOES(0, 32, 0, tile_width, tile_height);
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激,谢谢!
如果我使用一个glTexImage2D调用来创建一个像这样的缓冲区的纹理:
glTexImage2D(GL_TEXTURE_2D /* target*/,
0 /* level */,
GL_RGBA /* internal format */,
width /* w */,
height /* h */,
0 /* border */,
GL_RGBA /* format (RGBA 4)*/,
GL_UNSIGNED_BYTE /* type */,
buffer /* pixel buffer */);
Run Code Online (Sandbox Code Playgroud)
我可以修改缓冲区并期望纹理随之改变吗?
或者是在通话后最终确定了纹理?
像许多3D图形程序一样,我有一堆具有自己的模型坐标的对象(在x,y和z轴上从-1到1).然后,我有一个矩阵,从模型坐标到世界坐标(使用被绘制对象的位置,旋转和比例).最后,我有第二个矩阵将这些世界坐标转换为OopenGL ES 2.0将用于绘制到屏幕的规范坐标.
因此,因为一个对象可以包含许多顶点,所有顶点都使用相同的变换进入世界空间和规范坐标,所以一次计算这两个矩阵的乘积更快,并将每个顶点放在生成的矩阵中,而不是放置每个顶点都通过两个矩阵.
但是,据我所知,在OpenGL ES 2.0着色器中似乎没有办法让它一次计算矩阵,并继续使用它直到两个矩阵中的一个使用直到glUniformMatrix4fv()(或另一个)调用函数来设置统一).因此,似乎计算矩阵的唯一方法是在CPU上执行,然后使用统一结果生成GPU.否则,当像这样的事情:
gl_Position = uProjection * uMV * aPosition;
Run Code Online (Sandbox Code Playgroud)
它会一遍又一遍地计算,这似乎会浪费时间.
那么,哪种方式通常被认为是标准的?还是有一种我完全失踪的不同方式?据我所知,用于在OpenGL ES 2.0编程指南中实现OpenGL ES 1.1管道的着色器仅使用一个矩阵,那么使用更多?
我想渲染一个灰色的颜色纹理.使用着色器在ES 2.0中执行它是件小事,但是可以在ES 1.x中执行吗?
感谢@datenwolf,我这样做:
GLfloat weights_vector[4] = {0.2126, 0.7152, 0.0722, 1.0};
GLfloat additions_vector[4] = {0.5, 0.5, 0.5, 0.0};
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
/* First part */
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_DOT3_RGB);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_CONSTANT);
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, weights_vector);
/* Second part */
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_ADD);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PREVIOUS);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_CONSTANT);
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, additions_vector);
Run Code Online (Sandbox Code Playgroud)
第一部分渲染得很好,如果我自己留下它,但如果我添加第二部分,它使用"黑色"作为前一种颜色,所以我只得到灰色像素.我在这做错了吗?
如果我尝试使用GL_TEXTURE0而不是GL_PREVIOUS我确实得到相同的结果GL_TEXTURE.但是,如果我使用的话,我GL_TEXTURE1甚至不是灰色像素,而是黑色.我迷路了......
第二部分现在正在运作.应该只是使用@datenwolf建议的以前纹理的名称!
但是,输出仍然不正确,因为它是倒置的.我通过添加:
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_ONE_MINUS_SRC_COLOR);
Run Code Online (Sandbox Code Playgroud)
现在,它太黑了.我无法做对.尝试过但没有用:
我开始怀疑它是不可能的,因为偏见和乘法DOT3_RGB.在组合器中执行此操作的正确方法是: …
我在Android手机上测试OpenGL性能(确切地说就是HTC Wildfire),我遇到了一个奇怪的事情 - 当我尝试绘制一个像屏幕大小(320 x 480)的纹理索引矩形时,我可以得到一个帧速率高达40 fps! - 这只是在我使用32x32纹理时.
如果我将纹理大小增加到256x256,性能下降到35帧.
我的问题是 - 所有这些Android游戏如何能够顺利运行并且仍然充满了酷炫的图形.
我已经找了一段时间来回答这个问题 - 但我运气不好.我所要做的就是将我的普通数据传递到我的顶点着色器中.位置正确传入,但是在尝试加载着色器时,我收到"找不到正常属性"错误.
我的ATTRIB值是枚举.
我在OpenGL ES 2.0中为Iphone开发创建了一个多维数据集.
我的Shader.vsh看起来像这样:
attribute vec4 normal;
attribute vec4 position;
varying vec4 colorVarying;
uniform mat4 mvp_matrix;
void main()
{
//Trasform the vertex
gl_Position = mvp_matrix * position;
colorVarying = vec4(1.0, 1.0, 0.0, 0.0);
}
Run Code Online (Sandbox Code Playgroud)
我在drawframe中更新属性值的部分如下所示:
// Update attribute values.
glVertexAttribPointer(ATTRIB_VERTEX, 3, GL_FLOAT, 0, 0, cubeVerticesStrip);
glEnableVertexAttribArray(ATTRIB_VERTEX);
glVertexAttribPointer(ATTRIB_NORMAL, 3, GL_FLOAT, 0, 0, cubeNormalsStrip);
glEnableVertexAttribArray(ATTRIB_NORMAL);
Run Code Online (Sandbox Code Playgroud)
我在LoadShader函数中绑定它们的部分是这样的:
glBindAttribLocation(program, ATTRIB_VERTEX, "position");
glBindAttribLocation(program, ATTRIB_NORMAL, "normal");
Run Code Online (Sandbox Code Playgroud)
这个职位再次起作用.但是"正常"无法找到.有任何想法吗?
我有一个顶点属性数组GLfloat *vxData.我既结合GL_ARRAY_BUFFER并GL_ELEMENT_ARRAY_BUFFER与vxData和正确的索引数据和初始顶点渲染成功.
在每个渲染步骤中,我做:
glBindBuffer(GL_ARRAY_BUFFER, buffers[0]);
glBufferData(GL_ARRAY_BUFFER, vxDataSize, vxData, GL_STATIC_DRAW);
glDrawElements(...)
Run Code Online (Sandbox Code Playgroud)
在某个阶段,vxData更改大小以容纳更少/更多的顶点,重新创建索引数据以反映这一点,并vxDataSize进行更新.对于数据更改后的渲染,简单地调用上面的相同行是否正确?
我知道其他可能性,例如使用glMapBufferOES,我只想知道上述在这种情况下技术上是否正确.