我是opengl es的新手,我似乎无法弄清楚你将如何改变alpha / opacity 在装有GLKTextureLoader的纹理上。
现在我只使用以下代码绘制纹理。
self.texture.effect.texture2d0.enabled = YES;
self.texture.effect.texture2d0.name = self.texture.textureInfo.name;
self.texture.effect.transform.modelviewMatrix = [self modelMatrix];
[self.texture.effect prepareToDraw];
glEnableVertexAttribArray(GLKVertexAttribPosition);
glEnableVertexAttribArray(GLKVertexAttribTexCoord0);
NKTexturedQuad _quad = self.texture.quad;
long offset = (long)&_quad;
glVertexAttribPointer(GLKVertexAttribPosition,
2,
GL_FLOAT,
GL_FALSE,
sizeof(NKTexturedVertex),
(void *)(offset + offsetof(NKTexturedVertex, geometryVertex)));
glVertexAttribPointer(GLKVertexAttribTexCoord0,
2,
GL_FLOAT, GL_FALSE,
sizeof(NKTexturedVertex),
(void *)(offset + offsetof(NKTexturedVertex, textureVertex)));
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
任何建议都会非常有用:)
答案 0 :(得分:3)
我不是专家,但是用改变的alpha值绘制似乎不像rickster所描述的那样工作。
据我所知,传递给glBlendColor的值仅在使用glBlendFunc常量时使用:GL_CONSTANT_ ...
这将覆盖纹理alpha值并使用定义的值绘制:
glEnable(GL_BLEND);
glBlendFunc(GL_CONSTANT_ALPHA, GL_ONE_MINUS_CONSTANT_ALPHA);
glBlendColor(1.0, 1.0, 1.0, yourAlphaValue);
glDraw... // the draw operations
可在此处找到进一步的参考资料http://www.opengl.org/wiki/Blending#Blend_Color
答案 1 :(得分:-1)
只要您处于OpenGL ES 1.1世界(或GLKBaseEffect
的模拟-1.1世界),alpha就是纹理中的(每像素)位图数据或属性的属性。 (完成)您正在绘制的OpenGL ES状态。您无法单独为整个纹理设置不透明度级别。所以,你有三个选择:
更改纹理的alpha。这意味着更改纹理位图数据本身 - 使用您选择的2D图像上下文以半(或任何)alpha的形式绘制图像,并将生成的图像读取到OpenGL ES纹理中。可能不是一个好主意,除非你想要的alpha将在你的应用程序的生命周期中保持不变。在这种情况下,你可以回到Photoshop(或者你用来创建图像资源的任何东西)并在那里设置alpha。
更改您正在绘制的Alpha。在prepareToDraw
之后,在GL中设置混合:
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_CONSTANT_ALPHA);
glBlendColor(1.0, 1.0, 1.0, myDesiredAlphaValue);
glDraw... // whatever you're drawing
不要忘记A)在您想要混合的任何内容之后绘制部分透明的内容,并且B)在下一帧再次渲染不透明内容之前禁用混合。
抛弃GLKBaseEffect
并编写自己的着色器。像1.1固定功能管道一样工作的着色器只需要十几个 - 您甚至可以通过使用Xcode“OpenGL Game”项目模板打包的着色器或查看GLKit在Xcode帧捕获工具中编写的着色器来开始。一旦有了这样的着色器,更改从纹素查找中获得的颜色的alpha就是一个简单的操作:
vec4 color = texture2D(texUnit, texCoord);
color.a = myDesiredAlphaValue;
gl_FragColor = color;