- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我开始学习适用于 iPhone 的 OpenGL ES 1.1,并且想在一些 3D 对象后面以正交投影方式绘制 2D 图像。使用 Jeff Lamarche 的教程和《Pro OpenGL ES for iPhone》一书,我想出了以下几种方法来尝试做到这一点。如果我禁用对 drawSunInRect
的调用,则 3D 对象渲染得很好,我可以使用触摸控件等移动它们。如果我取消注释该调用并尝试绘制太阳图像,该图像将出现在 CGRect
我提供,但我看不到任何其他 3D 对象 - 屏幕的其余部分是黑色的。我尝试在各个地方禁用/启用深度测试,将不同的参数传递给 glOrthof()
,并围绕矩形移动,但只有在 drawSunInRect
时我才不断获取太阳图像code> 方法被调用。我假设它覆盖了我的 3D 对象。
// Draw Sun in Rect and with Depth
- (void)drawSunInRect:(CGRect)rect withDepth:(float)depth {
// Get screen bounds
CGRect frame = [[UIScreen mainScreen] bounds];
// Calculate vertices from passed CGRect and depth
GLfloat vertices[] =
{
rect.origin.x, rect.origin.y, depth,
rect.origin.x + rect.size.width , rect.origin.y, depth,
rect.origin.x, rect.size.height+rect.origin.y , depth,
rect.origin.x + rect.size.width , rect.size.height+rect.origin.y ,depth
};
// Map the texture coords - no repeating
static GLfloat textureCoords[] =
{
0.0, 0.0,
1.0, 0.0,
0.0, 1.0,
1.0, 1.0
};
// Disable DEPTH test and setup Ortho
glDisable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrthof(0,frame.size.width,frame.size.height,0,0.1f,1000.0);
// Enable blending and configure
glEnable(GL_BLEND);
glBlendFunc(GL_ONE,GL_ONE_MINUS_SRC_ALPHA);
// Enable VERTEX and TEXTURE client states
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
// Enable Textures
glEnable(GL_TEXTURE_2D);
// Projection Matrix Mode for ortho and reset
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
// No lighting or Depth Mask for 2D - no Culling
glDisable(GL_LIGHTING);
glDepthMask(GL_FALSE);
glDisable(GL_CULL_FACE);
glDisableClientState(GL_COLOR_ARRAY);
// Define ortho
glOrthof(0,frame.size.width,frame.size.height,0,0.1f,1000);
// From Jeff Lamarche Tutorials
// glOrthof(-1.0, // Left
// 1.0, // Right
// -1.0 / (rect.size.width / rect.size.height), // Bottom
// 1.0 / (rect.size.width / rect.size.height), // Top
// 0.01, // Near
// 10000.0); // Far
// Setup Model View Matrix
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
// Bind and draw the Texture
glBindTexture(GL_TEXTURE_2D,sunInt);
glVertexPointer(3, GL_FLOAT, 0, vertices);
glTexCoordPointer(2, GL_FLOAT,0,textureCoords);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
// Re-enable lighting
glEnable(GL_LIGHTING);
glDisable(GL_TEXTURE_2D);
glDisable(GL_BLEND);
glDisable(GL_DEPTH_TEST);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDepthMask(GL_TRUE);
}
// Override the draw in rect function
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
// Initialize and init the rotation stuff for the object
// Identity Matrix
glLoadIdentity();
static GLfloat rot = 0.0;
// Clear any remnants in the drawing buffers
// and fill the background with black
glClearColor(0.0f,0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Render the Sun - 2D Sun Image in CGRect
//[self drawSunInRect:CGRectMake(100, 100, 50, 50) withDepth:-30.0]; // 2D Sun Image
// Render the BattleCruiser - 3D Battlecruiser
[self renderTheBattleCruiser];
// Calculate a time interval to use to rotate the cruiser lives
static NSTimeInterval lastDrawTime;
if (lastDrawTime)
{
NSTimeInterval timeSinceLastDraw = [NSDate timeIntervalSinceReferenceDate] - lastDrawTime;
rot += 75 * timeSinceLastDraw;
}
lastDrawTime = [NSDate timeIntervalSinceReferenceDate];
}
我修改了绘制太阳方法,使 GL_PROJECTION
仅有 1 次推送和 1 次弹出。我仍然遇到同样的问题。太阳图像出现,但我看不到 3D 对象。我尝试重新安排对渲染方法的调用,以便首先渲染 3D 对象,但我得到了相同的结果。对于如何同时查看正交纹理和 3D 对象的其他想法,我将不胜感激。
// Draw Sun in Rect and with Depth
- (void)drawSunInRect:(CGRect)rect withDepth:(float)depth {
// Get screen bounds
CGRect frame = [[UIScreen mainScreen] bounds];
// Calculate vertices from passed CGRect and depth
GLfloat vertices[] =
{
rect.origin.x, rect.origin.y, depth,
rect.origin.x + rect.size.width , rect.origin.y, depth,
rect.origin.x, rect.size.height+rect.origin.y , depth,
rect.origin.x + rect.size.width , rect.size.height+rect.origin.y ,depth
};
// Map the texture coords - no repeating
static GLfloat textureCoords[] =
{
0.0, 0.0,
1.0, 0.0,
0.0, 1.0,
1.0, 1.0
};
glEnable(GL_BLEND);
glBlendFunc(GL_ONE,GL_ONE_MINUS_SRC_ALPHA);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnable(GL_TEXTURE_2D);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glDisable(GL_LIGHTING);
glEnable(GL_DEPTH_TEST);
glDisable(GL_CULL_FACE);
glDisableClientState(GL_COLOR_ARRAY);
glOrthof(0,frame.size.width,frame.size.height,0,0,1000);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glColor4f(1,1,1,1);
glBindTexture(GL_TEXTURE_2D,sunInt);
glVertexPointer(3, GL_FLOAT, 0, vertices);
glTexCoordPointer(2, GL_FLOAT,0,textureCoords);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glEnable(GL_LIGHTING);
glDisable(GL_TEXTURE_2D);
glDisable(GL_BLEND);
glDisable(GL_DEPTH_TEST);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
最佳答案
我意识到我在 viewController viewDidLoad 中只调用了一次 setClipping。我将它移动到我的 glkView 方法中,现在我得到了我的太阳图像和我的 3d 对象。
关于iphone - OpenGL ES 如何正确组合 Orthof 和 Frustum,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9133774/
我目前正在尝试为我的世界实现平截头体剔除(再次)。我的世界由大小为 16x256x16 (x, y, z) 的块组成: Frustum frustum = Frustum(engine.proj *
在处理 2+ 时,如何制作一个可以移动并绕其自身轴旋转的相机? 我有一个相机,我可以在世界空间中四处移动并进行某种旋转: frustum(-10,10,-10,10,10,2000); transla
我目前正在为一个学校项目开发我的第一个 3D 游戏,游戏世界完全受到我的世界的启发(世界完全由立方体组成)。我目前正在寻求提高尝试实现顶点缓冲区对象的性能,但我被卡住了,我已经实现了这些方法:Frus
我需要一些帮助来处理 THREE.Frustum 对象。 我的问题: 我需要计算近/远平面顶点;我看过这些教程 http://www.lighthouse3d.com/tutorials/view-f
我目前正在编写从模型空间到剪辑空间的转换,以便在 OpenGL 中使用。据我所知,程序员通常使用传统的矩形截头体来定义模型空间中的裁剪边界。我个人想到了一个像截锥体的形状,除了近平面和远平面是以截锥体
我正在使用 OpenGL ES 作为绘图 api 为 iPhone 开发游戏。我正在用一个绘制元素绘制整个大世界。根据截锥体,对象是可见的。 我想知道对象的另一部分会发生什么,它是绘制的吗?会影响FP
我开始学习适用于 iPhone 的 OpenGL ES 1.1,并且想在一些 3D 对象后面以正交投影方式绘制 2D 图像。使用 Jeff Lamarche 的教程和《Pro OpenGL ES fo
在 openGles 中,减少平截头体近平面(如您所见 here )会使物体看起来更近。我来自 3d,例如在 Vray 中,更改近裁剪平面不会修改距离,只会裁剪一些几何体。 为什么改变平截头体的近平面
我看到一个问题,如果所有顶点都保留在透视投影内的屏幕上,我可以正确绘制带纹理的多边形,但是如果我将四边形缩放到足够大,使得更多的顶点“远远落后于”查看体积,那么生成的 OpenGL 绘图不正确(请参见
我在 CPU 上实现了 Clip-Space Frustum Culling。在一个简单的简化案例中,我只是创建了一个基于 4 个不同点的矩形,我将在 GL_LINES 模式下渲染这些点。 但有时,在
我最近刚刚在我的体素游戏中添加了截锥体剔除;乍一看效果很好。然而,我立即注意到视锥体似乎有点偏离——因为窗口边缘附近的一些体素在完全脱离视觉范围之前被过早地切断。这是一张图片这说明了我的努力: 下面是
如果飞机在相机的视锥体内,我很难制作一个返回 true 的函数。我找到了这个帖子,on github ,但无论对象是否在截锥体中,配方始终返回 false。 任何人已经智能地实现了这一点?非常感谢。
我正在网站的 Bootstrap 模式(对话框)中使用 Unity WebGL 应用程序。只要此模式不可见 (display:none),控制台日志中就会始终出现此错误:“屏幕位置超出视锥体”。我该如
我正在使用 OpenGL 构建第一人称射击游戏,我正在尝试让枪支模型漂浮在镜头前。我使用资源反编译器从 Fallout 3 中提取了一个模型(转换为 .obj 并加载)。 然而,这是它在屏幕上的样子:
首先,这是非常简单的“新手标准”顶点着色器: in vec3 aPos; uniform mat4 uMatModel; uniform mat4 uMatView; uniform mat4 uMa
我是一名优秀的程序员,十分优秀!