Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.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
Cocoa OpenGL中不需要的透明度_Cocoa_Opengl - Fatal编程技术网

Cocoa OpenGL中不需要的透明度

Cocoa OpenGL中不需要的透明度,cocoa,opengl,Cocoa,Opengl,我正在用下面的代码制作一个纹理立方体,但是顶点离查看器越近,它们就越透明。此外,纹理似乎完全不可见 float rot = 0.01; @implementation ECGameView - (void)prepareOpenGL { glShadeModel(GL_SMOOTH); glClearColor(0.0, 0.0, 0.0, 0.0); glEnable(GL_NORMALIZE); glEnable(GL_DEPTH_TEST);

我正在用下面的代码制作一个纹理立方体,但是顶点离查看器越近,它们就越透明。此外,纹理似乎完全不可见

float rot = 0.01;

@implementation ECGameView

- (void)prepareOpenGL {
    glShadeModel(GL_SMOOTH);
    glClearColor(0.0, 0.0, 0.0, 0.0);

    glEnable(GL_NORMALIZE);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_COLOR_MATERIAL);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_CULL_FACE);
    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);

    GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
    GLfloat mat_shininess[] = { 50.0 };
    GLfloat lightPosition[] = { 1.0, 1.0, 1.0, 0.0 };
    GLfloat white_light[] = { 1.0, 1.0, 1.0, 1.0 };
    GLfloat lmodel_ambient[] = { 0.1, 0.1, 0.1, 1.0 };

    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
    glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
    glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, white_light);
    glLightfv(GL_LIGHT0, GL_SPECULAR, white_light);
    glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);

    NSImage * texImg = [NSImage imageNamed:@"texture.png"];
    glGenTextures(1, &texture);
    glBindTexture(GL_TEXTURE_2D, texture);
    NSBitmapImageRep * bitmap = [NSBitmapImageRep imageRepWithData:[texImg TIFFRepresentation]];
    glTexImage2D(GL_TEXTURE_2D, 0, 3, [texImg size].width, [texImg size].height, 0, GL_RGB, GL_UNSIGNED_BYTE, [bitmap bitmapData]) ;
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);

    updateTimer = [NSTimer scheduledTimerWithTimeInterval:.05 target:self selector:@selector(update:) userInfo:nil repeats:TRUE];
}

- (void) update:(NSTimer*)timer; {
    [self setNeedsDisplay:TRUE];
}

- (void)reshape {
    NSSize size = self.bounds.size;
    glViewport(0,0, size.width, size.height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45.0f, size.width/size.height, 0.1, 100.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glTranslatef(0.0, 0.0, -10.0);
}

- (void)drawRect:(NSRect)rect {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glBindTexture(GL_TEXTURE_2D, texture);

    glRotatef(rot, 1, 0, 1);
    rot = (rot + .01);

    static GLfloat vertices[] = {1.0, 1.0, 1.0, -1.0, 1.0, 1.0, -1.0, -1.0, 1.0, 1.0, -1.0, 1.0,
    1.0, 1.0, -1.0, -1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, -1.0,
    1.0, 1.0, 1.0, 1.0, -1.0, 1.0, 1.0, -1.0, -1.0, 1.0, 1.0, -1.0,
    -1.0, -1.0, 1.0, -1.0, -1.0, -1.0, 1.0, -1.0, -1.0, 1.0, -1.0, 1.0,
    -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, 1.0, -1.0,
    -1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, 1.0, 1.0};

    static GLfloat normals[] = {1.0, 1.0, 1.0, -1.0, 1.0, 1.0, -1.0, -1.0, 1.0, 1.0, -1.0, 1.0,
    1.0, 1.0, -1.0, -1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, -1.0,
    1.0, 1.0, 1.0, 1.0, -1.0, 1.0, 1.0, -1.0, -1.0, 1.0, 1.0, -1.0,
    -1.0, -1.0, 1.0, -1.0, -1.0, -1.0, 1.0, -1.0, -1.0, 1.0, -1.0, 1.0,
    -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, 1.0, -1.0,
    -1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, 1.0, 1.0};

    static const GLfloat texCoords[] = {
    0.0, 0.0,
    0.0, 1.0,
    1.0, 1.0,
    1.0, 0.0,
    0.0, 0.0,
    0.0, 1.0,
    1.0, 1.0,
    1.0, 0.0,
    0.0, 0.0,
    0.0, 1.0,
    1.0, 1.0,
    1.0, 0.0,
    0.0, 0.0,
    0.0, 1.0,
    1.0, 1.0,
    1.0, 0.0,
    0.0, 0.0,
    0.0, 1.0,
    1.0, 1.0,
    1.0, 0.0
    };

    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_NORMAL_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);

    glVertexPointer(3, GL_FLOAT, 0, vertices);
    glNormalPointer(GL_FLOAT, 0, normals);
    glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
    glDrawArrays(GL_QUADS, 0, 24);

    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_NORMAL_ARRAY);
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);

    glFlush();
}
所有绘图都是在
ECGameView
中完成的,它是NSOpenGLView的一个子类,标题中有一个
Gluint
变量。有人有什么想法吗

顺便说一句,我知道这是很多代码,但我真的不知道是什么错了,所有这些东西似乎都适用

编辑:我刚刚删除了代码中的颜色,它显示了一个橙色的立方体。我认为这意味着纹理是一种工作(纹理下面,从)

编辑2:请帮我解决这个问题。纹理问题已经解决,但我所问的问题还没有解决。我在立方体的一边发现了一个奇怪的洞。代码已更新


编辑3:我明白了为什么它会这样做,但我不知道如何修复它。它在平面的错误一侧(立方体的背面)绘制纹理。如何使其在正确的一侧绘制?

我看不到任何地方启用了纹理<代码>glEnable(GL_纹理_2D)

编辑:我还认为您将需要24(s,t)纹理坐标对

最后:看起来您没有启用背面消隐:
glEnable(GL\u CULL\u FACE)

如果面的顶点顺序(缠绕)在默认情况下不是逆时针(逆时针)的,您还应该查看
glPolygonMode

您确定它们是透明的吗?你有没有尝试过改变背景,看看它们是否真的变得透明或者更暗?如果颜色变暗了,那是因为你的光线。你说纹理不可见是什么意思?你的意思是你只看到立方体的颜色而没有纹理?或者当纹理化时整个对象不知何故是不可见的?你设置了纹理环境模式吗?我认为纹理只是没有显示出来,但我已经做了错误检查,它被正确加载了。这很让人困惑。我刚刚检查了颜色,我实际上可以看穿立方体的前半部分。我能看到两边和底部相连。我该如何把它们放进去?我不知道你所说的“24(s,t)纹理坐标对”是什么意思@Justin:你只提供了第一个GL_四边形的纹理坐标。你想再做5次。GL可能正在读取超过texCoords数组末尾的垃圾。这很有效。不幸的是,这仍然给我留下了奇怪的透明度问题。我将在几分钟后发布它的图片。我仍然在6面之一有一个方孔。它使几乎一半的侧面透明