我正在学习在 OpenGL ES 中使用着色器。
例如:这是我的游乐场片段着色器,它采用当前视频帧并使其灰度化:
varying highp vec2 textureCoordinate;
uniform sampler2D videoFrame;
void main() {
highp vec4 theColor = texture2D(videoFrame, textureCoordinate);
highp float avrg = (theColor[0] + theColor[1] + theColor[2]) / 3.0;
theColor[0] = avrg; // r
theColor[1] = avrg; // g
theColor[2] = avrg; // b
gl_FragColor = theColor;
}
Run Code Online (Sandbox Code Playgroud)
theColor表示当前像素。还可以访问同一坐标处的前一个像素会很酷。
出于好奇,我想将当前像素的颜色添加或乘以前一个渲染帧中像素的颜色。
我怎样才能保留之前的像素并将它们传递给我的片段着色器以便对它们做一些事情?
注意:它是 iPhone 上的 OpenGL ES 2.0。
谁能告诉我为什么glGenTextures()在我的构造函数中不起作用?
这是我的项目的设置方式:
.draw当前活动阶段的自定义渲染器。Global.activeStage。.draw当前处于活动状态的阶段,该阶段的引用保存在Global.activeStage..draw就没有问题。glGenTextures()- 它创建一个零值而不是 1..2..3 等等,一切都有效。GL10引用而不是.draw获取,所以这不是问题。似乎一切都只在已经存在对我正在使用的当前阶段的引用时才有效(如果该阶段已创建,例如构造函数已经运行)。
我不确定它是否相关,但舞台是在onCreateSurface结束后在线程中创建的。
如果你说哪些部分是相关的,我可以发布一些代码。
我在iOS上使用OpenGL ES 2渲染(相对)巨大的2D网格,其中正方形("像素")是脱节的 - 间隔而不是棋盘图案 - 并且概述了,并且我正在尝试最糟糕的时间找出一种有效的绘制方法,使得该正方形的每个正方形和轮廓可以分配不同的颜色,因为这是绘图应用程序.网格必须能够表示高达1024x1024"像素".
最初,我尝试了将所有顶点数据放在一个大型缓冲区中的方法,并且glDrawArrays每帧只需一次调用就可以渲染它,但正如您所料,内存使用情况不合理,只有轮廓(用GL_LINES制作) ) - 没有填充.进一步的研究让我了解了实例绘图,我现在正在做的glDrawArraysInstancedEXT,但是,当然,1024*1024实例绘制调用正在杀死CPU/FPS.我猜这个问题的解决方案介于两种方法之间 - 使用简并顶点绘制一个更大的"分组"GL_TRIANGLE_STRIPs原语来分隔生成的方块......但是我不认为我可以给每个方格它自己的颜色.不用说,我还在学习; 人们通常如何绘制大量简单,相同但色彩鲜艳的多边形?
相关代码......
static const int numColumns = 1024;
static const int numRows = 1024;
static const GLfloat outlineVertices[] = {
0.1f, -0.1f,
0.9f, -0.1f,
0.1f, -0.9f,
0.9f, -0.9f
};
static const GLfloat innerVertices[] = {
0.2f, -0.2f,
0.8f, -0.2f,
0.2f, -0.8f,
0.8f, -0.8f
};
- (void)setupGL
{
[EAGLContext setCurrentContext:self.context];
[self loadShaders];
glDisable(GL_DEPTH_TEST);
glGenVertexArraysOES(1, &_vertexArray);
glBindVertexArrayOES(_vertexArray);
glGenBuffers(1, &_vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(outlineVertices), outlineVertices, GL_STATIC_DRAW); …Run Code Online (Sandbox Code Playgroud) 我有一个巨大的vbo,整个事情每一帧都在改变.
我听说过快速更改缓冲区数据的不同方法,但其中只有一个对我的程序来说是一个好主意.但是,我不理解它,无法找到任何代码示例.
我听说有人声称你应该用"null"作为数据调用glBufferData,然后用每帧填充真实数据.这是什么目的?这在代码中是什么样的?
In some WebGL application, let's assume that we have a GLSL vertex shader which starts like this:
attribute vec4 foo1;
attribute vec4 foo2;
attribute vec4 foo3;
attribute vec4 foo4;
Run Code Online (Sandbox Code Playgroud)
and some corresponding Javascript code for binding a data structure for those attributes:
var buf = gl.createBuffer(), loc;
gl.bindBuffer(gl.ARRAY_BUFFER, buf);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([…]));
loc = gl.getAttribLocation(program, 'foo1');
gl.enableVertexArray(loc);
gl.vertexAttribPointer(loc, 4, gl.FLOAT, false, 16, 0);
loc = gl.getAttribLocation(program, 'foo2');
gl.enableVertexArray(loc);
gl.vertexAttribPointer(loc, 4, gl.FLOAT, false, 16, 4);
loc = gl.getAttribLocation(program, 'foo3');
gl.enableVertexArray(loc);
gl.vertexAttribPointer(loc, …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用OpenGL2.0并在3D空间中为Android设备创建多个立方体.
代码在某些设备中运行得很好,但在其他设备中却没有,我不知道为什么......(所有设备都支持OpenGL 2.0,并且有最新的Android版本[5.0或6.0])
我只知道问题是-1返回值(见下)
int vertexShader = loadGLShader(GLES20.GL_VERTEX_SHADER, R.raw.vertex);
int gridShader = loadGLShader(GLES20.GL_FRAGMENT_SHADER, R.raw.grid_fragment);
int passthroughShader = loadGLShader(GLES20.GL_FRAGMENT_SHADER, R.raw.fragment_color);
cubeProgram1 = GLES20.glCreateProgram();
GLES20.glAttachShader(cubeProgram1, vertexShader);
GLES20.glAttachShader(cubeProgram1, passthroughShader);
GLES20.glLinkProgram(cubeProgram1);
GLES20.glUseProgram(cubeProgram1);
cubePositionParam1 = GLES20.glGetAttribLocation(cubeProgram1, "a_Position");
cubeNormalParam1 = GLES20.glGetAttribLocation(cubeProgram1, "a_Normal"); ----> Returns -1 Value
cubeLightPosParam1 = GLES20.glGetUniformLocation(cubeProgram1, "u_LightPos");
cubeModelParam1 = GLES20.glGetUniformLocation(cubeProgram1, "u_Model") cubeModelViewParam1 = GLES20.glGetUniformLocation(cubeProgram1, "u_MVMatrix");
cubeModelViewProjectionParam1 = GLES20.glGetUniformLocation(cubeProgram1, "u_MVP");
Run Code Online (Sandbox Code Playgroud)
....
GLES20.glEnableVertexAttribArray(cubeNormalParam1); ---> Returns -1 ...
Run Code Online (Sandbox Code Playgroud)
cubeNormalParam1 = GLES20.glGetAttribLocation(cubeProgram1, "a_Normal");某些设备的返回值为2,其他设备的返回值为-1.那些有-1值,给出错误但没有运行的人......
我正在尝试看看vertex_shader是否有错误,但我看不出任何问题......
uniform mat4 u_Model;
uniform mat4 u_MVP;
uniform mat4 u_MVMatrix;
uniform vec3 u_LightPos; …Run Code Online (Sandbox Code Playgroud) 我正在开发AR应用程序.我有一个SceneKit场景被渲染到SCNView(使用OpenGL ES作为渲染API).在此下方是另一个显示相机实时预览的视图.我想创建一个包含视频和3D场景的电影.
我正在使用基于Apple的RosyWriter示例代码的代码来处理带有OpenGL着色器的视频帧像素缓冲区.我认为我不太了解这些概念,因为我不确定如何在视频帧上叠加SceneKit渲染.我可以从SCNView/SCNSceneRenderer获取像素缓冲区,还是需要使用SCNRenderer将场景重新渲染到OpenGL捕获管道用于处理视频帧的屏幕外缓冲区中的纹理?
我想学习OpenGL以C语言编写游戏程序,但对于选择哪个库感到有些困惑,目的是使用游戏逻辑生成一个C库并使用Android NDK与手机中的资源进行接口。
我找到了一个使用GLESv2库的示例,并且运行良好,我想我知道GLES库是因为移动设备无法使用完整的OpenGL库而创建的。
但是真正的问题是:GLES是否是完整的OpelGL库的子集,以便我可以在Linux桌面上使用GLES库来构建和运行游戏应用程序?
如果我正确地使用这些库,您能给我一个提示吗?
OpenGL ES着色语言的文档(第5.11节)指出向量和矩阵乘法运算以正确的线性代数方式执行.线性代数教导我们如果我们将矩阵乘以向量,我们得到这样的结果:
1.0 1.0 0.0 -1.0 (1.0*-1.0)+(1.0*0.0)+(0.0*0.0)=-1.0
0.5 0.0 0.0 * 0.0 = (0.5*-1.0)+(0.0*0.0)+(0.0*0.0)=-0.5
0.0 0.0 0.0 0.0 (0.0*-1.0)+(0.0*0.0)+(0.0*0.0)= 0.0
1.0 1.0 0.0 0.0 1.0
0.5 0.0 0.0 * 1.0 = 0.0
0.0 0.0 0.0 0.0 0.0
1.0 1.0 0.0 1.0 1.0
0.5 0.0 0.0 * 0.0 = 0.5
0.0 0.0 0.0 0.0 0.0
Run Code Online (Sandbox Code Playgroud)
但是当我在WebGL顶点着色器中使用这个数学知识用于矢量乘法矩阵时,我面临着问题.当我尝试乘以上述矩阵的模拟时:
mat4 matrix=mat4(
1.0, 1.0, 0.0, 0.0,
0.5, 0.0, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0);
Run Code Online (Sandbox Code Playgroud)
三个垂直:红色(x = -1,y = 0,z = …
我已经使用WebGL1一段时间了,但是现在我对WebGL2有了更多的了解,我对Vertex Array实际的工作感到困惑。例如,在下面的示例中,我可以删除对其的所有引用(例如,创建,绑定,删除),并且该示例继续运行。