这是我的顶点着色器:
attribute vec4 a_position;
uniform mat4 u_projection;
uniform vec4 u_origin_translation;
uniform vec4 u_translation;
attribute vec2 a_texCoord;
varying vec2 v_texCoord;
uniform vec4 u_color;
varying vec4 v_color;
attribute vec4 a_color;
void main()
{
vec4 pos = a_position + u_origin_translation + u_translation;
gl_Position = u_projection * pos;
v_texCoord = a_texCoord;
v_color = a_color * u_color;
}
和像素着色器:
precision mediump float;
varying vec2 v_texCoord;
uniform sampler2D s_texture;
varying vec4 v_color;
void main()
{
vec4 texColor = texture2D(s_texture, v_texCoord);
gl_FragColor = texColor * v_color;
}
我试图在Marmalade 7.1平台的OpenGL ES 2.0上下文中渲染纹理四边形;
将矩阵数据(投影统一“ u_projection ”)发送到着色器的源代码:
GLint projectionUniformLocation = glGetUniformLocation(m_ShaderProgram->GetHandle(), m_ShaderProgram->GetProjectionUniformName().c_str());
glUniformMatrix4fv(projectionUniformLocation, 1, 0, &m_Ortho[0]);
我的跟踪代码:
glGetActiveUniform(m_ShaderProgram->GetHandle(), projectionUniformLocation, maxUniformLength, 0, &size, &type, &buffer[0]);
TRACE_OUT("Context::ApplyOrtho: type is matrix " << (type == GL_FLOAT_MAT4));
TRACE_OUT("Context::ApplyOrtho: type is " << type);
TRACE_OUT("Context::ApplyOrtho: buffer is " << &buffer[0]);
TRACE_OUT("Context::ApplyOrtho: projectionUniformLocation is " << projectionUniformLocation);
整个程序在Windows上的模拟器中运行良好。它显示纹理四边形,从跟踪我的projectionUniformLocation是的类型GL_FLOAT_MAT4 ,所以是正确的。
但!!!当我在ipad 3上运行它时,相同的代码会以另一种方式起作用。
跟踪显示我的projectionUniformLocation不是 GL_FLOAT_MAT4 ,但它是 GL_SAMPLER_2D ,并且输出缓冲区消息包含“ s_texture ”! 可见结果是黑色四边形,没有纹理。
更新:在Windows上的模拟器中,projectionUniformLocation索引为3,但在ipad上,索引为2;
Update2:来自模拟器的 Activity 制服列表:
Context::PrintActiveUniforms: active is s_texture and it's location is 0
Context::PrintActiveUniforms: active is u_color and it's location is 1
Context::PrintActiveUniforms: active is u_origin_translation and it's location is 2
Context::PrintActiveUniforms: active is u_projection and it's location is 3
Context::PrintActiveUniforms: active is u_translation and it's location is 4
并从ipad列出:
Context::PrintActiveUniforms: active is u_origin_translation and it's location is 0
Context::PrintActiveUniforms: active is u_color and it's location is 1
Context::PrintActiveUniforms: active is s_texture and it's location is 7
Context::PrintActiveUniforms: active is u_projection and it's location is 2
Context::PrintActiveUniforms: active is u_translation and it's location is 6
Update3:有关ipad 3上制服的更多信息(Andon M. Coleman感谢您提供源代码):
eTB_GLSL__print_uniforms: (loc=0) type=vec4 name=u_origin_translation size=1
eTB_GLSL__print_uniforms: (loc=1) type=vec4 name=u_color size=1
eTB_GLSL__print_uniforms: (loc=7) type=sampler2D name=s_texture size=1
eTB_GLSL__print_uniforms: (loc=2) type=mat4 name=u_projection size=1
eTB_GLSL__print_uniforms: (loc=6) type=vec4 name=u_translation size=1
为什么glGetActiveUniform说我的u_projection不是mat4,为什么我看不到纹理?
有任何想法吗?
最佳答案
幸运的是,this的问题对我有所帮助。我没有在找必要的地方。两行代码解决了我的问题,并且出现了纹理:
glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );