試圖將我的遊戲引擎從PC移植到Android我碰到了一些OpenGL函數的障礙,它們在文檔中沒有任何幫助理解爲什麼。在GLES 2.0中查詢活動制服和頂點屬性
問題出現在PC上的着色器程序中,我通過OpenGL查詢屬性和制服來構建一個鍵控集合,這樣很容易自動化傳遞公共參數。
在PC上我使用下面的函數來構造鍵集合:
void LoadUniforms()
{
int activeUniforms;
GL.GetProgram(m_ID, ProgramParameter.ActiveUniforms, out activeUniforms);
for (int i = 0; i < activeUniforms; i++)
{
int size;
ActiveUniformType type;
string name = GL.GetActiveUniform(m_ID, i, out size, out type);
ShaderUniform uniform = null;
uniform = new ShaderUniform(this, name, size, type);
if (uniform != null)
m_uniformParameters.Add(uniform);
}
}
我試圖將其轉換爲OpenTK的GLES 2.0的下面,這始終是最大長度和activeUniforms的收益爲0。
void LoadUniforms()
{
int length = 0;
int maxLength = 0;
GL.GetProgram(m_ID, All.ActiveUniformMaxLength, ref maxLength);
int activeUniforms = 0;
GL.GetProgram(m_ID, All.ActiveUniforms, ref activeUniforms);
for (int i = 0; i < activeUniforms; i++)
{
All type = All.None;
int size = 0;
string name = string.Empty;
GL.GetActiveUniform(m_ID, i, maxLength, ref length, ref size, ref type, name);
ShaderUniform uniform = new ShaderUniform(this, name, size, (ShaderUniformType)type);
if (uniform != null)
m_uniformParameters.Add(uniform);
}
}
於是我轉移到努力Android.Opengl懷疑,也許OpenTK的GLES 2.0接口是不完全的,但還是同樣的問題。
所以現在我留下了這個問題。我是否在編譯和鏈接着色器程序和能夠查詢活動制服之間錯過了一些步驟?當試圖查詢活動屬性時也會出現完全相同的問題(對於最大長度和計數,始終得到0)。
我一直用來測試它的頂點着色器如下。
uniform mat4 World;
uniform mat4 View;
uniform mat4 Projection;
attribute vec3 Posiiton;
attribute vec2 TexCoord;
varying vec2 TexCoord0;
void main()
{
mat4 worldViewProject = Projection * View * World;
vec4 pos = vec4(Position, 1);
pos *= World;
pos *= View;
pos *= Project;
gl_Position = pos;
TexCoord0 = TexCoord;
}
我真的討厭不得不去通過遊戲中使用的每一個着色器和手動更自動的方法我已經使習慣成長爲寵壞之後繪製出參數。所以我真的希望這只是我錯過的東西。