Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenGL纹理组合不(始终)工作_Opengl_Textures_Jogl - Fatal编程技术网

OpenGL纹理组合不(始终)工作

OpenGL纹理组合不(始终)工作,opengl,textures,jogl,Opengl,Textures,Jogl,如果你看过我最后的几个问题,你现在就会知道我一直在用OpenGL处理地形。我尝试使用顶点Alpha和多个渲染过程在平铺高度贴图中将一个纹理混合到另一个纹理时失败了。。。所以现在我有了另一个计划 我的WorldQuad对象有“底部”和“顶部”变量,这两种类型都是纹理。这是一个JOGL提供的类,用于包装OpenGL纹理;它为我加载它,然后我可以调用enable()让它执行glEnable(GL_TEXTURE_2D),然后调用bind()让它执行绑定 它还有一个我自己类型的alphaMap变量,它存

如果你看过我最后的几个问题,你现在就会知道我一直在用OpenGL处理地形。我尝试使用顶点Alpha和多个渲染过程在平铺高度贴图中将一个纹理混合到另一个纹理时失败了。。。所以现在我有了另一个计划

我的WorldQuad对象有“底部”和“顶部”变量,这两种类型都是纹理。这是一个JOGL提供的类,用于包装OpenGL纹理;它为我加载它,然后我可以调用enable()让它执行glEnable(GL_TEXTURE_2D),然后调用bind()让它执行绑定

它还有一个我自己类型的alphaMap变量,它存储了另一种纹理;但这是一个纹理内部格式GL_ALPHA8(换句话说,它是一个只有alpha值的纹理)。我目前以编程的方式生成它,使其像素完美

然后,我使用OpenGL“纹理组合”(有时称为纹理散点),以便根据alpha贴图组合底部和顶部纹理

问题是,它工作得很好!!。。。在我的工作笔记本电脑上。它是一款带有集成英特尔芯片(GMA950或类似产品)的IBM Thinkpad T400。但我回到家中,发现我的程序只渲染具有“底部”纹理的四边形。就好像阿尔法根本没有被应用。我也在两台台式机和另一台笔记本电脑上试用过。其中一台台式机崩溃,另一台显示为全白色(这是一个旧的GeForce芯片,可能不支持OpenGL 2或其他东西),另一台笔记本电脑的性能与我的相同;底部纹理中覆盖的四边形

我已经尝试将alpha贴图格式更改为GL_RGBA,以防我的图形卡因为某种原因不喜欢GL_alpha 8纹理。我还验证了所有三种纹理都存在,并且可以通过使用每个单独的纹理(包括alphamap)绘制法线四边形进行渲染。我还将alphamap输出到一个文件中,所以我基本上已经仔细检查了它是否在那里并且应该可以工作

下面是我基于所有这些绘制四边形的函数。我已经添加了一些评论,希望你能跟上。请提出任何可能解决问题的建议。我被难住了!为什么它能在一个蹩脚的集成芯片上工作,却不能在我的显卡上工作?我错过了什么

谢谢

编辑:好吧,显然没人能帮我。。。我现在回来工作了,将我的闪存驱动器插入我的工作电脑,启动Eclipse并点击运行按钮。。。它成功了。然后我把硬盘拿出来,放进我的个人笔记本电脑(我今天带去上班),做了完全相同的事情,只是一个红色的斑点。但在这里,我记录了它。首先

接下来。 同样,这些都采取了完全相同的方式:打开Eclipse,按run,截图。就这样。我没有碰我的代码,我在两台计算机之间交换的闪存驱动器上只有一份代码副本。它们都有相同版本的JDK

现在,这两台电脑之间的一个区别是,我的工作电脑运行的是XP,而我的笔记本电脑运行的是Windows7。但这真的应该有所不同吗?特别是因为我使用的是OpenGL2,我认为这两台计算机都会同样支持它。事实上,如果你看看上面我的diff页面,我的个人笔记本电脑支持的扩展比工作笔记本电脑多得多——正如我所料,因为与intel integrated相比,它是一款nvidia 7900gs卡。所以这似乎是倒退;如果有的话,我希望集成芯片会因纹理组合而窒息,但我的图形卡不会

救命啊

public void drawWorldQuad(GL2 gl、浮点x、浮点z、WorldQuad q、WorldVertex tl、WorldVertex tr、WorldVertex bl、WorldVertex br){
WorldVertex[]顶点=新的WorldVertex[]{
bl、br、tr、tl
};
最终浮动[][]texCoords=新浮动[][]{
{0.0f,0.0f},
{1.0f,0.0f},
{1.0f,1.0f},
{0.0f,1.0f}
};
最终浮动[][]坐标=新浮动[][]{
{x,z},
{x+1,z},
{x+1,z+1},
{x,z+1}
};
gl.glColor4f(1.0f,1.0f,1.0f,1.0f);
/*开始纹理混合部分:*/
/*TEXTURE0是alpha贴图;类型为GL_alpha 8的纹理,没有rgb通道*/
gl.glActiveTexture(GL2.gl_TEXTURE0);
q、 alphaMap.getTexture().bind();
q、 alphaMap.getTexture().enable();
gl.glTexEnvi(GL2.gl_纹理_环境,GL2.gl_纹理_环境模式,GL2.gl_贴花);
/*纹理1是“底部”纹理*/
gl.glActiveTexture(GL2.gl_TEXTURE1);
q、 bottom.getTexture().bind();
q、 bottom.getTexture().enable();
//使用底部纹理中的rgb
gl.glTexEnvi(GL2.gl_纹理_环境,GL2.gl_纹理_环境模式,GL2.gl_组合);
gl.glTexEnvi(GL2.gl_纹理_环境,GL2.gl_组合_RGB,GL2.gl_贴花);
gl.glTexEnvi(GL2.gl_纹理_环境,GL2.gl_源0_RGB,GL2.gl_纹理);
gl.glTexEnvi(GL2.gl_纹理_环境,GL2.gl_操作数_RGB,GL2.gl_SRC_颜色);
//------------------------
//使用alphaMap中的alpha值
gl.glTexEnvi(GL2.gl_纹理_环境,GL2.gl_组合_ALPHA,GL2.gl_贴花);
gl.glTexEnvi(GL2.gl_纹理_环境,GL2.gl_源0_ALPHA,GL2.gl_先前);
gl.glTexEnvi(GL2.gl_纹理_环境,GL2.gl_操作数_α,GL2.gl_SRC_α);
/*纹理2是“顶部”纹理*/
gl.glActiveTexture(GL2.gl_TEXTURE2);
q、 top.getTexture().bind();
q、 top.getTexture().enable();
gl.glTexEnvi(GL2.gl_纹理_环境,GL2.gl_纹理_环境模式,GL2.gl_组合);
//使用alpha值在texture1和texture2的颜色之间插值
//来自纹理1(取自字母地图)
gl.glTexEnvi(GL2.gl_纹理_环境,GL2.gl_组合_RGB,GL2.gl_插值);
gl.glTexEnvi(GL2.gl_纹理_环境,GL2.gl_源0_RGB,GL2.gl_先前);
gl.glTexEnvi(GL2.gl_纹理_环境,GL2.gl_源1_RGB,GL2.gl_纹理);
gl.glTexEnvi(GL2.gl_纹理_环境,GL2.gl_源2_RGB,GL2.gl_先前);
gl.glTexEnvi(GL2.gl_纹理_环境,gl
public void drawWorldQuad(GL2 gl, float x, float z, WorldQuad q, WorldVertex tl, WorldVertex tr, WorldVertex bl, WorldVertex br) {
    WorldVertex[] verts = new WorldVertex[] {
        bl, br, tr, tl
    };
    final float[][] texCoords = new float[][] {
            {0.0f, 0.0f},
            {1.0f, 0.0f},
            {1.0f, 1.0f},
            {0.0f, 1.0f}
    };
    final float[][] coords = new float[][] {
            {x,z},
            {x+1,z},
            {x+1,z+1},
            {x,z+1}
    };

    gl.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);

    /* BEGIN TEXTURE BLENDING SECTION: */

    /* TEXTURE0 is the alpha map; a texture of type GL_ALPHA8, no rgb channels */
    gl.glActiveTexture(GL2.GL_TEXTURE0);
    q.alphaMap.getTexture().bind();
    q.alphaMap.getTexture().enable();
    gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_TEXTURE_ENV_MODE, GL2.GL_DECAL);

    /* TEXTURE1 is the 'bottom' texture */
    gl.glActiveTexture(GL2.GL_TEXTURE1);
    q.bottom.getTexture().bind();
    q.bottom.getTexture().enable();
    // use the rgb from the bottom texture
    gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_TEXTURE_ENV_MODE, GL2.GL_COMBINE);
    gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_COMBINE_RGB, GL2.GL_DECAL);
    gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_SOURCE0_RGB, GL2.GL_TEXTURE);
    gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_OPERAND0_RGB, GL2.GL_SRC_COLOR);
    //------------------------
    // use the alpha value from the alphaMap
    gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_COMBINE_ALPHA, GL2.GL_DECAL);
    gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_SOURCE0_ALPHA, GL2.GL_PREVIOUS);
    gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_OPERAND0_ALPHA, GL2.GL_SRC_ALPHA);

    /* TEXTURE2 is the 'top' texture */
    gl.glActiveTexture(GL2.GL_TEXTURE2);
    q.top.getTexture().bind();
    q.top.getTexture().enable();
    gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_TEXTURE_ENV_MODE, GL2.GL_COMBINE);
    // interpolate between texture1 and texture2's colors, using the alpha values
    // from texture1 (which were taken from the alphamap)
    gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_COMBINE_RGB, GL2.GL_INTERPOLATE);
    gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_SOURCE0_RGB, GL2.GL_PREVIOUS);
    gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_SOURCE1_RGB, GL2.GL_TEXTURE);
    gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_SOURCE2_RGB, GL2.GL_PREVIOUS);
    gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_OPERAND0_RGB, GL2.GL_SRC_COLOR);
    gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_OPERAND1_RGB, GL2.GL_SRC_COLOR);
    gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_OPERAND2_RGB, GL2.GL_SRC_ALPHA);
    //------------------------
    // interpolate the alphas (this doesn't really matter, neither of the textures
    // really have alpha values)
    gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_COMBINE_ALPHA, GL2.GL_INTERPOLATE);
    gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_SOURCE0_ALPHA, GL2.GL_PREVIOUS);
    gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_SOURCE1_ALPHA, GL2.GL_TEXTURE);
    gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_SOURCE2_ALPHA, GL2.GL_PREVIOUS);
    gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_OPERAND0_ALPHA, GL2.GL_SRC_ALPHA);
    gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_OPERAND1_ALPHA, GL2.GL_SRC_ALPHA);
    gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_OPERAND2_ALPHA, GL2.GL_SRC_ALPHA);

    gl.glBegin(GL2.GL_QUADS);
    {
        for(int j=0;j<verts.length;j++) {
            // (this loop and the arrays used here are for convenience, it just draws
            // a quad; verts.length == 4)

            WorldVertex v = verts[j];

            gl.glMultiTexCoord2f(GL2.GL_TEXTURE0, texCoords[j][0], texCoords[j][3]);
            gl.glMultiTexCoord2f(GL2.GL_TEXTURE1, texCoords[j][0], texCoords[j][4]);
            gl.glMultiTexCoord2f(GL2.GL_TEXTURE2, texCoords[j][0], texCoords[j][5]);

            gl.glVertex3f(coords[j][0], (float)v.height * VERTICAL_SCALE, coords[j][6]);
        }
    }
    gl.glEnd();

}
gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_TEXTURE_ENV_MODE, GL2.GL_DECAL);
gl.glTexEnvi(GL2.GL_TEXTURE_ENV, GL2.GL_TEXTURE_ENV_MODE, GL2.GL_REPLACE);