gpt4 book ai didi

cocoa - OpenGL 中不需要的透明度

转载 作者:行者123 更新时间:2023-12-03 16:43:49 25 4
gpt4 key购买 nike

我正在使用以下代码制作一个纹理立方体,但顶点距离观察者越近,它们就越透明。此外,纹理似乎完全看不见。

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的子类,在 header 中有一个Gluint变量。有人有什么想法吗?

顺便说一句,我知道这是很多代码,但老实说我不知道​​出了什么问题,而且所有这些事情似乎都适用。

编辑:我刚刚删除了代码中的颜色,它显示了一个橙色立方体。我认为这意味着纹理正在发挥作用(下面的纹理,来自 http://www.nullterminator.net/gltexture.html )。

The texture I am using for this test

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

Strange hole

编辑3:我弄清楚了为什么它正在做事,但我不知道如何解决它。它正在平面的错误一侧(立方体的背面)绘制纹理。我怎样才能让它画在正确的一边?

最佳答案

我没有看到任何地方启用了纹理。 glEnable(GL_TEXTURE_2D);

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

最后:看来您尚未启用背面剔除:glEnable(GL_CULL_FACE);如果默认情况下面的顶点顺序(缠绕)不是 CCW(逆时针),您还应该查看 glPolygonMode

关于cocoa - OpenGL 中不需要的透明度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8040870/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com