我正在使用OpenGL的C#和OpenTK库,我想将GLControl与作为背景放置的图片框混合在一起.
*编辑*
我通过改变方法解决了加载源图像的问题,所以现在我使用位图和位图数据结构:
Bitmap bitmap = new Bitmap("image.png");
BitmapData data = bitmap.LockBits(new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height),
ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
Run Code Online (Sandbox Code Playgroud)
我确定我的png源有4个通道,黑色背景上的alpha值为0
这是原始图片:http: //imageshack.com/a/img801/517/u2z8.png
这就是问题所在:http: //imageshack.com/a/img40/1729/zezj.jpg
top是使用GLControl的纹理,bottom是Windows Form的Picturebox,我想要做的是GLControl的黑色背景变得透明.
我把Blend cap启用并使用GL.BlendFunc(BlendingFactorSrc.SrcAlpha, BlendingFactorDest.OneMinusSrcAlpha);所以我认为这不是问题.
也许问题出在纹理环境上?
GL.TexEnv(TextureEnvTarget.TextureEnv, TextureEnvParameter.TextureEnvMode,GL_MODULATE);
Run Code Online (Sandbox Code Playgroud) 我正在寻找一种方法来获取支持的OpenGL ES版本列表或运行时在iOS设备上提供的最大OpenGL ES版本?
理想情况下解决方案绝不能:
PS:项目设置:基础SDK =最新iOS(7.0)部署目标:4.3
我正在编写光线跟踪程序,主要思想是将三角形和.obj模型的索引保存为2个纹理:
a)顶点纹理b)指数纹理
我这样做是为了在我的GLSL片段着色器中做一个光线三角形交叉,浏览器告诉我,我有纹理的这个问题:
a)Mozilla Firefox:
错误#1(带顶点纹理):错误:WebGL:texImage2D:无效类型0x1406.
错误#2(带索引纹理):错误:WebGL:texImage2D:无效类型0x1403.
b)谷歌浏览器:
两种纹理都出错:webgl invalid_enum teximage2d无效的纹理类型
这是代码:
Obj.prototype.initTextures = function(){
this.vertexTexture = gl.createTexture();
gl.activeTexture(gl.TEXTURE0)
gl.bindTexture(gl.TEXTURE_2D, this.vertexTexture);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB, this.vertexSize, 1, 0, gl.RGB, gl.FLOAT, new Float32Array(this.vertexArray));
gl.bindTexture(gl.TEXTURE_2D, null);
this.trianglesTexture = gl.createTexture();
gl.activeTexture(gl.TEXTURE1);
gl.bindTexture(gl.TEXTURE_2D, this.trianglesTexture);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB, this.faceSize, 1, 0, gl.RGB, gl.UNSIGNED_SHORT, …Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,我有一个RelativeLayout包含另外两个RelativeLayouts.第一个RelativeLayout用于OpenGL视图.第二个用于放置Buttons和其他Views.我能够在OpenGL中处理好的触摸事件,除非它们发生在其中一个上Views.
这通常很好,但有时我希望OpenGL视图也接收事件,但前面的View总是消耗触摸事件.我试过使用以下,没有运气:
@Override
public boolean onInterceptTouchEvent(MotionEvent ev)
{
onTouchEvent(ev);
return false;
}
Run Code Online (Sandbox Code Playgroud) 我试图为WebGL编写一对着色器,这将允许我渲染一个颜色立方体.但是,当我尝试打开文件时,收到错误"无法初始化着色器程序".我该如何调试这个以及在哪里开始查看着色器?我已经能够使用更具体的错误进行一些调试,但我不知道从哪种一般消息开始.任何帮助将不胜感激!
这是代码:
<script id="shader-fs" type="x-shader/x-fragment">
varying lowp vec3 vColor;
varying highp vec3 vLighting;
void main(void) {
gl_FragColor = vec4(vColor * vLighting, 1.0);
}
</script>
<!-- Vertex shader program -->
<script id="shader-vs" type="x-shader/x-vertex">
attribute highp vec3 aVertexNormal;
attribute highp vec3 aVertexPosition;
attribute highp vec4 aVertexColor;
uniform highp mat4 uNormalMatrix;
uniform highp mat4 uMVMatrix;
uniform highp mat4 uPMatrix;
varying highp vec3 vLighting;
varying highp vec4 vColor;
void main(void) {
gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);
//Apply the coloration to the …Run Code Online (Sandbox Code Playgroud) 我正试图掩盖一个精灵,所以我写了一个简单的片段着色器,它只渲染未隐藏在另一个纹理(掩码)下的像素.问题是,在通过着色器后,我的纹理似乎有y坐标偏移.
这是我要屏蔽的精灵(GroundZone)的init方法:
bool GroundZone::initWithSize(Size size) {
// [...]
// Setup the mask of the sprite
m_mask = RenderTexture::create(textureWidth, textureHeight);
m_mask->retain();
m_mask->setKeepMatrix(true);
Texture2D *maskTexture = m_mask->getSprite()->getTexture();
maskTexture->setAliasTexParameters(); // Disable linear interpolation on the mask
// Load the custom frag shader with a default vert shader as the sprite’s program
FileUtils *fileUtils = FileUtils::getInstance();
string vertexSource = ccPositionTextureA8Color_vert;
string fragmentSource = fileUtils->getStringFromFile(
fileUtils->fullPathForFilename("CustomShader_AlphaMask_frag.fsh"));
GLProgram *shader = new GLProgram;
shader->initWithByteArrays(vertexSource.c_str(), fragmentSource.c_str());
shader->bindAttribLocation(GLProgram::ATTRIBUTE_NAME_POSITION, GLProgram::VERTEX_ATTRIB_POSITION);
shader->bindAttribLocation(GLProgram::ATTRIBUTE_NAME_TEX_COORD, GLProgram::VERTEX_ATTRIB_TEX_COORDS);
shader->link();
CHECK_GL_ERROR_DEBUG();
shader->updateUniforms();
CHECK_GL_ERROR_DEBUG();
int maskTexUniformLoc = shader->getUniformLocationForName("u_alphaMaskTexture"); …Run Code Online (Sandbox Code Playgroud) 我正在制作3D游戏.
游戏需要大约100个立方体才能工作,所有立方体都是动态的.
我真的不知道这样的游戏需要多少性能,但我正在使用带有Mali-400 MP2 GPU,1 GB RAM,1.5 GHz双核的平板电脑进行测试.我知道在一个网格中渲染所有立方体,但是我不能分别移动所有这些立方体.
这个设置给了我一个非常摇摆的fps.跳跃在20到50之间,大多在30以下.(在模拟器10-15中)
当游戏开始时,我构建了一个ModelInstances的arraylist,他们都使用相同的模型.
model = new ModelBuilder().createBox(1f, 1f, 1f, new Material(ColorAttribute.createDiffuse(Color.GREEN)), Usage.Position | Usage.Normal);
// width,height,length = 5, creating a total of 125 cubes
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
for (int z = 0; z < length; z++) {
if (this.map[x][y][z] > 0) {
this.modelInstances.add(instance = new ModelInstance(model));
instance.transform.translate(x, -(y * 1.5f), -z);
}
} …Run Code Online (Sandbox Code Playgroud) 当我在室内启用照明时,突然发现深度测试无法正常工作。经过一些旋转后,看起来某些对象是透明的。从这个角度看手柄应该是不可见的。
我在一开始就使用glEnable(GL_DEPTH_TEST)。
我正在使用OpenGL ES 2.0
可能有什么问题吗?
当我不使用光时,一切看起来都很好。

是否可以在曲面视图中仅创建一个3D纹理,并在不同的曲面视图中使用相同的ID.在这里,我在3个表面视图中创建相同的纹理,并在内存中占用三倍的空间.是否可以为所有这些视图创建一个共同的纹理并在这些视图中使用它?
我想发送一个缓冲区列表(到GPU /顶点着色器),其中包含有关顶点位置,世界位置,颜色,比例和旋转的信息.
如果我的每个3D对象都有一个矩阵中的变换相关信息,我怎样才能通过VBO将这个矩阵数组(除了其他顶点数据)传递给GPU?
更新 请原谅任何错别字:
// bind & set vertices.
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
gl.vertexAtribPointer(a_Position, 3, gl.FLOAT, false, stride, 0);
// bind & set vertex normals.
gl.bindBuffer(gl.ARRAY_BUFFER,, vertexNormalsBuffer);
gl.vertexAttribPointer(a_Normal, 3, gl.FLOAT, false, stride, 0);
// becaue i cant pass in a model matrix via VBO, im tryng to pass in my world coordinates.
gl.bindBuffer(gl.ARRAY_BUFFER, worldPositionBuffer);
// not sure why i need to do this, but most tutorials i've read says to do this.
gl.bindBuffer(gl.ARRAY_BUFFER, null);
// bind & draw index buffer.
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, …Run Code Online (Sandbox Code Playgroud)