我的程序是3D Spectrum处理器,它将显示信号强度(y)与频率(x)对时间(z)的关系。它基本上绘制了一个三维高度图,顶点的高度对应于信号强度。 基本程序流程是创建具有固定x和z坐标的高度图,并计算索引。在此之后,获得新的Y坐标并使用GL.BufferSubData调用更新整个3D表面。基本上新的光谱数据进入,它被放置在所有其他光谱数据的前面,其余的用循环缓冲器向后移动。新数据的数据处理相当快,大约需要20ms。
现在数据量相当大。我绘制了2048个点,我有50到100行。所以大约有100,000到200,000个顶点。这些都是用单个GL.DrawElements绘制的,顶点是VBO,索引是VBO。
现在,我有一个测试程序,如果数据可用,它会向openGL程序生成顶点和信号。如果是,它将数据传输到顶点数组。如果没有更多的sdata可用,它只是绘制。
绘图似乎很慢但我不确定我要求太多。我们需要绘制大约300,000个三角形,然后用2D着色器对它们进行着色,它基本上只使用顶点的高度来选择颜色。
所以我看到2.3 GHz的四核Core i7采用nVidia 540m显卡,每帧大约150 ms。这很慢。如果我使窗口变小,速度会大大提高,如果是全屏则会变得更糟。
我在这里期待太多了吗?或者我的代码中有问题吗?
这是问题陈述。为什么程序这么慢?
我正在使用带有opengl4Csharp库的c#。
这是代码: GLUT空闲回调具有:
Gl.Viewport(0, 0, width, height);
Gl.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
// use our vertex shader program
Gl.UseProgram(plottingProgram);
Gl.BindTexture(myTexture); //this is the 2D texture
Gl.TexParameteri(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, TextureParameter.ClampToEdge);
Gl.TexParameteri(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, TextureParameter.ClampToEdge);
plottingProgram["model_matrix"].SetValue(Matrix4.CreateRotationY(yangle) * Matrix4.CreateRotationX(xangle));
if (dataAvailable)
{
CircularBuffer.UpdateVertexArray(); //this updates the y vertex values
spectrumVBO.BufferSubData(vertexBuffer); //vertexBuffer is an array with x,y,z data. x, is always the same
dataAvailable = false;
}
Gl.BindBufferToShaderAttribute(spectrumVBO, plottingProgram, "vertexPosition");
Gl.BindBuffer(spectrumIndicesVBO);
Gl.DrawElements(BeginMode.TriangleStrip, spectrumIndicesVBO.Count, DrawElementsType.UnsignedInt, IntPtr.Zero);
以下是着色器:
public static string VertexShader = @"
#version 130
in vec3 vertexPosition;
out vec2 textureCoordinate;
uniform mat4 projection_matrix;
uniform mat4 view_matrix;
uniform mat4 model_matrix;
void main(void)
{
textureCoordinate = vertexPosition.xy;
gl_Position = projection_matrix * view_matrix * model_matrix * vec4(vertexPosition, 1);
}
";
public static string FragmentShader = @"
#version 130
uniform sampler2D texture;
in vec2 textureCoordinate;
out vec4 fragment;
void main(void)
{
fragment = texture2D(texture,textureCoordinate);
}
";