- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我开始学习 OpenGL 并将其与 SFML 2.1 一起使用以获取窗口、加载图像等。但是我遇到了简单棱镜的问题。面部部分透明,看起来很糟糕:/我正在看教程,但我不知道我的代码有什么问题......你能帮帮我吗?我读到这是 Z-Buffering 的问题。如何解决?
这是我的代码:
#include <iostream>
#include <stdio.h>
#include <cmath>
#include <SFML/OpenGL.hpp>
#include <SFML/Graphics.hpp>
using namespace std;
void drawCube (float x, float y, float z, float width, float height, GLuint Texture);
int main()
{
// Window
sf::RenderWindow window(sf::VideoMode(800, 600), "OpenGL", sf::Style::Default, sf::ContextSettings(32));
// Camera
GLdouble eyex = 0;
GLdouble eyey = 0;
GLdouble eyez = 2575;
GLuint Texture = 0;
{
sf::Image Image;
if (!Image.loadFromFile("background.png"))
return EXIT_FAILURE;
glGenTextures(1, &Texture);
glBindTexture(GL_TEXTURE_2D, Texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, Image.getSize().x, Image.getSize().y, 0, GL_RGBA, GL_UNSIGNED_BYTE, Image.getPixelsPtr());
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
}
// Main loop
while (window.isOpen())
{
// Checking events
sf::Event event;
while (window.pollEvent(event))
{
// Close the window
if (event.type == sf::Event::Closed)
window.close();
// Resize the window
if (event.type == sf::Event::Resized)
glViewport(0, 0, event.size.width, event.size.height);
}
// Close the window
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Escape))
window.close();
// Clear the window
window.clear(sf::Color::White);
// Viewport
glViewport( 0, 0, window.getSize().x, window.getSize().y );
// Matrix Mode
glMatrixMode( GL_PROJECTION );
// Matrix Load Identity
glLoadIdentity();
// Perspective
gluPerspective(window.getSize().y/45.0, 1.0f*window.getSize().x/window.getSize().y, 0.0f, 100.0f);
// Clear color buffer
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Set Matrix Mode
glMatrixMode( GL_MODELVIEW );
// Matrix Load Identity
glLoadIdentity();
// Change camera position
if (sf::Keyboard::isKeyPressed(sf::Keyboard::W))
eyey -= 0.1f;
if (sf::Keyboard::isKeyPressed(sf::Keyboard::S))
eyey += 0.1f;
if (sf::Keyboard::isKeyPressed(sf::Keyboard::A))
eyex -= 0.1f;
if (sf::Keyboard::isKeyPressed(sf::Keyboard::D))
eyex += 0.1f;
printf("%f %f\n", eyex, eyey);
// Set the camera
gluLookAt( eyex, -eyey, eyez, eyex, -eyey, 0, 0, 1, 0 );
// RECTANGLE
/*
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, Texture);
glColor4f( 0.0, 1.0, 0.0, 1.0f );
glScalef(1,-1,1);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f(100, 200, 0.0f);
glTexCoord2f(3.333333f, 0.0f); glVertex3f(200, 200, 0.0f);
glTexCoord2f(3.333333f, 3.333333f); glVertex3f(200, 300, 0.0f);
glTexCoord2f(0.0f, 3.333333f); glVertex3f(100, 300, 0.0f);
glEnd();
glDisable(GL_TEXTURE_2D);
*/
// Set color drawing
glColor3f( 0.0, 0.0, 0.0 );
glScalef(1,-1,1);
// Draw cube
drawCube(0.0f, 0.0f, 1000.0f, 100.0f, 100.0f, Texture);
// Flush the scene
glFlush();
// Update the window
window.display();
}
return 0;
}
void drawCube (float x, float y, float z, float width, float height, GLuint Texture)
{
width /= 2;
height /= 2;
x += width;
y += height;
y = -y;
width = -width;
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, Texture);
glBegin(GL_QUADS);
glColor3f(1.0f, 0.0f, 0.0f);
// Top face
glVertex3f( x + width, y + height, 0.0f);
glVertex3f( x - width, y + height, 0.0f);
glVertex3f( x - width, y + height, z);
glVertex3f( x + width, y + height, z);
glColor3f(1.0f, 1.0f, 0.0f);
// Left face
glVertex3f( x - width, y + height, z);
glVertex3f( x - width, y + height, 0.0f);
glVertex3f( x - width, y - height, 0.0f);
glVertex3f( x - width, y - height, z);
glColor3f(0.0f, 1.0f, 1.0f);
// Right face
glVertex3f( x + width, y + height, 0.0f);
glVertex3f( x + width, y + height, z);
glVertex3f( x + width, y - height, z);
glVertex3f( x + width, y - height, 0.0f);
glColor3f(0.0f, 0.0f, 0.0f);
// Bottom face
glVertex3f( x + width, y - height, 0.0f);
glVertex3f( x - width, y - height, 0.0f);
glVertex3f( x - width, y - height, z);
glVertex3f( x + width, y - height, z);
glColor3f(0.0f, 1.0f, 0.0f);
// Front face
glVertex3f( x + width, y + height, z);
glVertex3f( x - width, y + height, z);
glVertex3f( x - width, y - height, z);
glVertex3f( x + width, y - height, z);
glEnd();
glDisable(GL_TEXTURE_2D);
}
这是我的结果:
最佳答案
你是对的,这个问题与 Z-Buffering 有关。
实际上我在您的代码中看到了两个问题:
并非所有硬件都支持 32 位深度缓冲区
sf::ContextSettings (24, 8)
请求。OpenGL 中默认禁用深度测试
sf::RenderWindow
后通过添加对 glEnable (GL_DEPTH_TEST)
的调用来自行启用它。我第一次运行您的代码时完全错过了这一点:
// Perspective
gluPerspective(
window.getSize().y/45.0, 1.0f*window.getSize().x/window.getSize().y,
0.0f, 100.0f);
~~~~
您正在使用 0.0
作为透视投影矩阵中的近平面。这是一件非常糟糕的事情,它会完全扰乱您的深度范围,这可能是您在评论中包含的两个屏幕截图的原因。
两个平面必须是正值。如果 gluPerspective (...)
实际上是 OpenGL API 的一部分,它会在这些情况下生成 GL_INVALID_VALUE
错误。另请注意,近平面和远平面之间的距离将决定深度缓冲区的整体精度(这在 gluPerspective
的文档中进行了讨论)。
要更正此问题,请为近平面使用非常接近但不完全是 0.0
的值(即 0.1
)。
关于c++ - 简单的彩色 3D 棱镜,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19140924/
假设我有一对转换函数 string2int :: String -> Maybe Int int2string :: Int -> String 我可以使用光学很容易地表示这些。 stringIntP
在使用镜头时,我偶尔需要在光学链中进行一些基本的文本解析。在我处理的一个 API 中,有一个像这样的 JSON 字段: "timespent": "0.25", 由于它被错误地编码为字符串而不是数字,
我开始学习 OpenGL 并将其与 SFML 2.1 一起使用以获取窗口、加载图像等。但是我遇到了简单棱镜的问题。面部部分透明,看起来很糟糕:/我正在看教程,但我不知道我的代码有什么问题......你
我正在使用 Unity 4.6 开发一个项目。我想知道是否有一种简单的方法来以编程方式设置顶点位置。目前我的代码看起来像这样 (C#): public void createPoints(float
我正在使用 Prism并且它适用于 CSS: p { color: red } 但我不能让它为 html 工作: red text 我有两个问题: 表示为标签,而不是文本,但我可以将其替换为 <
只需阅读精彩的“Lens/Aeson Traversals/Prisms" 文章并拥有一个实际应用程序。给定以下匿名 JSON 结构,我将如何棱镜出一个集合而不是特定值? {"Locations" :
我正在尝试在多对多表(引用自身)上使用 prisma 这样的一行将有子孙 我可以毫无问题地获取所有行,但我正在努力了解如何在可读的 JSON 中排序数据,这将阻止在前端进行解析 预期输出如下:返回的
我正在 Unity 中创建一个 2D sprite 游戏,这是一个 3D 游戏开发环境。我已将对象的所有平移限制在 XY 平面上,并将旋转限制在 Z 轴上。 我的问题是用于检测对象之间碰撞的网格必须仍
我正在尝试在多对多表(引用自身)上使用 prisma 这样的一行将有子孙 我可以毫无问题地获取所有行,但我正在努力了解如何在可读的 JSON 中排序数据,这将阻止在前端进行解析 预期输出如下:返回的
我有两个表 User 和 Post 由自定义的多对多表链接,例如: model User { id Int @id @default(autoincrement()
我有一个包含三个矩阵的列表a和一个具有三个高度(任何正实数)的向量h。这些矩阵形成三角形,即棱柱的底面。我想添加向量h的信息来构造棱镜。 我创建了一个以 2D 形式绘制图形的函数 (pplot)。如何
这个在跟我玩,我似乎无法弄明白 - 我需要一些外部帮助,兄弟们! 我想要一个没有标题、最小化、最大化和关闭按钮的弹出窗口,因为我们想自己设置样式并在弹出窗口的屏幕上添加自定义关闭按钮。 所以我通过这些
我正在扩展 Prism使用自定义语言,我想突出显示类型(int、float、bool)。 我想匹配不以点或 : 符号开头的字符串。 我已经尝试过单独使用正则表达式但无法使其工作,所以我可能必须使用 P
我是一名优秀的程序员,十分优秀!