C++寫光柵化渲染器遇到些問題?

本人現在用C++寫一個光柵化的渲染器··,而且自己用&API寫控制台(真是折騰··), 在實現的時候,發現了些問題, 就是我不知道怎麼把自己寫的像素數組,讓它在自己寫的窗口裡顯示(= = 汗!), 我發現有一個函數是SetPiexl(hdc, x, x),它能實現我想要的, 但是我現在就是要實現這個函數,而不是用這個函數啊!我發現不了有什麼方法能獲取到hdc的像素··,自己寫的也不知道如何顯示,在此求高人指點一下迷津。。。。。。求指教,求吐槽


SetPixel太慢了,你用CreateDIBSections,然後指定格式(推薦RGBA),然後把那塊內存拿出來寫,寫完直接BitBlt到窗口上就可以了。

具體做法可以看這個文件(GacUI/WinGDI.h at master · vczh-libraries/GacUI · GitHub)的WinBitmap類,自己去對應的cpp找代碼,大概就包含了你要的東西。


可以輸出到 ppm 圖片,四行代碼

smallpt: Global Illumination in 99 lines of C++

FILE *f = fopen("image.ppm", "w"); // Write image to PPM file.
fprintf(f, "P3
%d %d
%d
", w, h, 255);
for (int i=0; i&


SetPixel非常非常慢,自己維護一個Color數組然後用BitBlt

也可以用glDrawPixels來畫,配合glfw創建窗口非常方便,能跨平台,Input也解決了


用GDI+好了,和DX一樣Lock/Copy/Unlock。


用控制台做畫布的話可以用不同的符號代替不同的像素,不過還是黑白頂用


#pragma once
#include &

class Surface
{
public:
HDC m_hDC;
void* m_pData;

Surface();
~Surface();

void Prepare(int width, int height);
private:
void Release();

int m_iWidth;
int m_iHeight;
HBITMAP m_hBitmap_;
HBITMAP m_hBitmap;
};

#include "Surface.h"

Surface::Surface():m_hDC(NULL)
{
}

Surface::~Surface(void)
{
Release();
}

void Surface::Prepare(int width, int height)
{
if (m_hDC == NULL || m_iWidth != width || m_iHeight != height)
{
Release();

m_iWidth = width;
m_iHeight = height;
m_hDC = ::CreateCompatibleDC(NULL);
BITMAPINFOHEADER bmphdr = {0};
bmphdr.biSize = sizeof(BITMAPINFOHEADER);
bmphdr.biWidth = width;
bmphdr.biHeight = -height;
bmphdr.biPlanes = 1;
bmphdr.biBitCount = 32;
m_hBitmap = ::CreateDIBSection(NULL, (PBITMAPINFO)bmphdr, DIB_RGB_COLORS, m_pData, NULL, 0);
m_hBitmap_ = (HBITMAP)::SelectObject(m_hDC, m_hBitmap);
::SetBkMode(m_hDC, TRANSPARENT);
}
}

void Surface::Release()
{
if (m_hDC != NULL)
{
::SelectObject(m_hDC, m_hBitmap_);
::DeleteObject(m_hBitmap);
::DeleteDC(m_hDC);
m_hDC = NULL;
}
}

給你段自己使用的代碼,就一個簡單的內存DC的封裝,直接往m_pData寫數據就可以了,簡單粗暴


推薦閱讀:

如何高效學習並掌握現代C++?
learn python the hard way 習題13運行問題..?
為什麼人們會崇拜一個編程語言?
程序猿怎樣才能修鍊到負責一個真正意義上的項目?
學好編程可以幹什麼?

TAG:編程 | C | 計算機圖形學 |