ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – SFML绘制像素阵列

2019-08-25 14:16:29  阅读:230  来源: 互联网

标签:sfml c raycasting


我在互联网上找到了这个(http://lodev.org/cgtutor/raycasting.html)教程并且很感兴趣并且想要创建我自己的教程.我想在SFML中做到这一点,我想扩展它,并制作一个3D版本,所以玩家可以走的不同级别.因此,每个像素需要1条光线,因此必须独立绘制每个像素.我发现了这个(http://www.sfml-dev.org/tutorials/2.1/graphics-vertex-array.php)教程,让数组成为单独的顶点似乎很容易.首先,我认为最好的办法是创建一个可以读取光线返回的像素的类,然后将它们绘制到屏幕上.我使用了VertexArray,但由于某些原因,事情没有用.我试图孤立这个问题,但我收效甚微.我写了一个只有绿色像素的简单顶点数组,它应该填满屏幕的一部分,但仍然存在问题.像素只显示我的代码和图片.我的意思

#include "SFML/Graphics.hpp"  
int main() {
sf::RenderWindow window(sf::VideoMode(400, 240), "Test Window");
window.setFramerateLimit(30);
sf::VertexArray pointmap(sf::Points, 400 * 10);
for(register int a = 0;a < 400 * 10;a++) {
    pointmap[a].position = sf::Vector2f(a % 400,a / 400);
    pointmap[a].color = sf::Color::Green;
}
while (window.isOpen()) {
    sf::Event event;
    while (window.pollEvent(event)) {
        if (event.type == sf::Event::Closed)
        window.close();
    }
    window.clear();
    window.draw(pointmap);
    //</debug>
    window.display();
}
return 0;

}

http://oi43.tinypic.com/s5d9aw.jpg http://oi43.tinypic.com/s5d9aw.jpg

我的意思是用绿色来填充前10行,但显然这不是我所做的……我想如果我能弄清楚是什么导致这不起作用,我可以解决主要问题.另外如果您认为有更好的方法可以做到这一点,您可以让我知道:)

谢谢!

解决方法:

我认为你误用了顶点数组.看看教程表中的sf :: Quads原语:你需要定义4个点(坐标)来绘制四边形,而像素只是边长度的四边形1.

所以你需要的是创建一个大小为400 * 10 * 4的顶点数组,并为每个后面的四个顶点设置相同的位置.

您还可以使用SFML提供的另一种方法:逐个像素地直接绘制纹理并显示它.它可能不是最有效的事情(你必须与顶点比较),但它具有相当简单的优点.

const unsigned int W = 400;
const unsigned int H = 10; // you can change this to full window size later

sf::UInt8* pixels = new sf::UInt8[W*H*4];

sf::Texture texture;
texture.create(W, H); 

sf::Sprite sprite(texture); // needed to draw the texture on screen

// ...

for(register int i = 0; i < W*H*4; i += 4) {
    pixels[i] = r; // obviously, assign the values you need here to form your color
    pixels[i+1] = g;
    pixels[i+2] = b;
    pixels[i+3] = a;
}

texture.update(pixels);

// ...

window.draw(sprite);

sf :: Texture :: update函数接受一个sf :: UInt8数组.它们代表纹理的每个像素的颜色.但由于像素需要为32位RGBA,因此sf :: UInt8之后的4是像素的RGBA合成物.

标签:sfml,c,raycasting
来源: https://codeday.me/bug/20190825/1719533.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有