Browse Source

修复矩阵颜色错乱问题

master
blobt 5 years ago
parent
commit
b2a5c72568
  1. 1
      CMakeLists.txt
  2. 4
      src/1raster/draw_triangle.cc
  3. 1
      src/5threed/Raster.cc
  4. 5446
      src/5threed/common.h
  5. 202
      src/7threed/Raster.cc
  6. 17
      src/7threed/Raster.h
  7. 44
      src/7threed/threed.cc

1
CMakeLists.txt

@ -2,7 +2,6 @@ cmake_minimum_required (VERSION 3.10)
project(3dbase)
set(CMAKE_CXX_COMPILER "g++")
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)

4
src/1raster/draw_triangle.cc

@ -81,7 +81,7 @@ void example4() {
int2 p[3] = {
int2(100, 150),
int2(250, 250),
int2(350, 50)
int2(350, 150)
};
Ege e0(p[0].x, p[0].y, p[1].x, p[1].y, Rgba(255, 0, 0, 0), Rgba(0, 255, 0, 0));
@ -102,7 +102,7 @@ void example4() {
// raster.drawEge(e1, e2);
raster.drawTriangle(p[0], p[1], p[2], Rgba(255, 0, 0, 0), Rgba(0, 255, 0, 0), Rgba(0, 0, 255, 0));
raster.drawTriangle(p[0], p[1], p[2], Rgba(0, 0, 255,0), Rgba(0, 255, 0, 0), Rgba(255, 0, 0, 0));
}
unsigned char* makeBitmap() {

1
src/5threed/Raster.cc

@ -451,6 +451,7 @@ float3 Raster::piplineTransform(float3 pos) {
screen.x = screen.x * _viewPort.x;
screen.y = screen.y * _viewPort.y;
//screen.y = _viewPort.y - (screen.y * _viewPort.y);
return float3(screen.x, screen.y, screen.z);
}

5446
src/5threed/common.h
File diff suppressed because it is too large
View File

202
src/7threed/Raster.cc

@ -42,6 +42,8 @@ Raster::Raster(int width, int height) {
_defaultUvPointer.data = _defaultUvArray;
_matModel = matrix4(1);
_matView = matrix4(1);
_matProj = matrix4(1);
}
Raster::~Raster() {
@ -185,7 +187,7 @@ void Raster::drawSpan(const Span &span, Image* image) {
setPixel(i, span.y, color);
setPixel(i, span.y, blendColor);
}
}
@ -224,7 +226,7 @@ void Raster::drawEge(const Ege& e1, const Ege& e2, Image* image) {
} else {
x2 = e2.x2 - xOffset2 * scale2;
}
color2 = colorLerp(e2.color1, e2.color2, scale2);
color2 = colorLerp(e2.color2, e2.color1, scale2);
uvE2 = uvLerp(e2.uv2, e2.uv1, scale2);
scale2 += setp2;
//setPixel(x2, y, Rgba(255,0,0));
@ -236,7 +238,7 @@ void Raster::drawEge(const Ege& e1, const Ege& e2, Image* image) {
} else {
x1 = e1.x2 - xOffset1 * scale1;
}
color1 = colorLerp(e1.color1, e1.color2, scale1);
color1 = colorLerp(e1.color2, e1.color1, scale1);
uvE1 = uvLerp(e1.uv2, e1.uv1, scale1);
scale1 += setp1;
//setPixel(x1, y, Rgba(255,0,0));
@ -263,8 +265,12 @@ void Raster::drawTriangle(Ege eges[3], Image* image) {
int iShort1 = (iMax + 1) % 3;
int iShort2 = (iMax + 2) % 3;
//printf("max:%d (%d,%d) (%d,%d) (%d,%d,%d) (%d,%d,%d)\n", iMax,eges[iMax].x1, eges[iMax].y1, eges[iMax].x2, eges[iMax].y2, eges[iMax].color1._r, eges[iMax].color1._g, eges[iMax].color1._b, eges[iMax].color2._r, eges[iMax].color2._g, eges[iMax].color2._b);
//printf("sho:%d (%d,%d) (%d,%d) (%d,%d,%d) (%d,%d,%d)\n", iShort1,eges[iShort1].x1, eges[iShort1].y1, eges[iShort1].x2, eges[iShort1].y2, eges[iShort1].color1._r, eges[iShort1].color1._g, eges[iShort1].color1._b, eges[iShort1].color2._r, eges[iShort1].color2._g, eges[iShort1].color2._b);
drawEge(eges[iMax], eges[iShort1], image);
drawEge(eges[iMax], eges[iShort2], image);
//drawEge(eges[iMax], eges[iShort2], image);
}
void Raster::drawTriangle(const Vertex& vertex, Image* image) {
@ -320,67 +326,154 @@ void Raster::drawArrays(DRAWMODE pri, int start, int count) {
char* cData = (char*) colorPointerdesc.data;
char* uvData = (char*) uvPointerdesc.data;
_matProjView = _matProj * _matView;
matrix4 matPVT = _matProjView.transpose();
_frust.loadFrustum(matPVT);
for (int i = start; i < start + count; i += 3) {
float* pp = (float*) posData;
float4 mp0(pp[0], pp[1], pp[2], 1);
mp0 = _matModel * mp0;
float3 mp0(pp[0], pp[1], pp[2]);
posData += _positionPointer.stride;
pp = (float*) posData;
float4 mp1(pp[0], pp[1], pp[2], 1);
mp1 = _matModel * mp1;
float3 mp1(pp[0], pp[1], pp[2]);
posData += _positionPointer.stride;
pp = (float*) posData;
float4 mp2(pp[0], pp[1], pp[2], 1);
mp2 = _matModel * mp2;
float3 mp2(pp[0], pp[1], pp[2]);
int2 p0(mp0.x, mp0.y);
int2 p1(mp1.x, mp1.y);
int2 p2(mp2.x, mp2.y);
posData += _positionPointer.stride;
Rgba* pc = (Rgba*) cData;
Rgba c0(*pc);
cData += _colorPointer.stride;
pc = (Rgba*) cData;
Rgba c1(*pc);
cData += _colorPointer.stride;
pc = (Rgba*) cData;
Rgba c2(*pc);
cData += _colorPointer.stride;
float* puv = (float*) uvData;
float2 uv0(puv[0], puv[1]);
uvData += _uvPointer.stride;
puv = (float*) uvData;
float2 uv1(puv[0], puv[1]);
uvData += _uvPointer.stride;
puv = (float*) uvData;
float2 uv2(puv[0], puv[1]);
uvData += _uvPointer.stride;
Ege eges[3] = {
Ege(p0.x, p0.y, p1.x, p1.y, c0, c1, uv0, uv1),
Ege(p1.x, p1.y, p2.x, p2.y, c1, c2, uv1, uv2),
Ege(p2.x, p2.y, p0.x, p0.y, c2, c0, uv2, uv0),
};
drawTriangle(eges, _texture);
if (_colorPointer.data == 0) {
cData = (char*) colorPointerdesc.data;
}
mp0 = mp0 * _matModel;
mp1 = mp1 * _matModel;
mp2 = mp2 * _matModel;
if (_frust.pointInFrustum(mp0) || _frust.pointInFrustum(mp1) || _frust.pointInFrustum(mp2)) {
mp0 = piplineTransform(mp0);
mp1 = piplineTransform(mp1);
mp2 = piplineTransform2(mp2);
int2 p0(mp0.x, mp0.y);
int2 p1(mp1.x, mp1.y);
int2 p2(mp2.x, mp2.y);
posData += _positionPointer.stride;
Rgba* pc = (Rgba*) cData;
Rgba c0(*pc);
cData += _colorPointer.stride;
pc = (Rgba*) cData;
Rgba c1(*pc);
cData += _colorPointer.stride;
pc = (Rgba*) cData;
Rgba c2(*pc);
cData += _colorPointer.stride;
float* puv = (float*) uvData;
float2 uv0(puv[0], puv[1]);
uvData += _uvPointer.stride;
puv = (float*) uvData;
float2 uv1(puv[0], puv[1]);
uvData += _uvPointer.stride;
puv = (float*) uvData;
float2 uv2(puv[0], puv[1]);
uvData += _uvPointer.stride;
Ege eges[3] = {
Ege(p0.x, p0.y, p1.x, p1.y, c0, c1, uv0, uv1),
Ege(p1.x, p1.y, p2.x, p2.y, c1, c2, uv1, uv2),
Ege(p2.x, p2.y, p0.x, p0.y, c2, c0, uv2, uv0),
};
if (_uvPointer.data == 0) {
uvData = (char*) uvPointerdesc.data;
drawTriangle(eges, _texture);
if (_colorPointer.data == 0) {
cData = (char*) colorPointerdesc.data;
}
if (_uvPointer.data == 0) {
uvData = (char*) uvPointerdesc.data;
}
}
}
}
float3 Raster::piplineTransform2(float3 pos) {
float4 world(pos.x, pos.y, pos.z, 1);
float4 screen = _matProjView * world;
if (screen.w == 0.0f) {
return false;
}
//printf("1 %f %f %f\n",screen.x, screen.y, screen.z);
screen.x /= screen.w;
screen.y /= screen.w;
screen.z /= screen.w;
// map to range 0 - 1
screen.x = screen.x * 0.5f + 0.5f;
screen.y = screen.y * 0.5f + 0.5f;
screen.z = screen.z * 0.5f + 0.5f;
// map to viewport
screen.x = screen.x * _viewPort.x;
screen.y = screen.y * _viewPort.y;
//screen.y = _viewPort.y - (screen.y * _viewPort.y);
return float3(screen.x, screen.y, screen.z);
}
float3 Raster::piplineTransform(float3 pos) {
float4 world(pos.x, pos.y, pos.z, 1);
float4 screen = _matProjView * world;
if (screen.w == 0.0f) {
return false;
}
screen.x /= screen.w;
screen.y /= screen.w;
screen.z /= screen.w;
// map to range 0 - 1
screen.x = screen.x * 0.5f + 0.5f;
screen.y = screen.y * 0.5f + 0.5f;
screen.z = screen.z * 0.5f + 0.5f;
// map to viewport
screen.x = screen.x * _viewPort.x;
screen.y = screen.y * _viewPort.y;
//screen.y = _viewPort.y - (screen.y * _viewPort.y);
return float3(screen.x, screen.y, screen.z);
}
void Raster::loadProjMatrix(const matrix4& mat) {
_matProj = mat;
}
void Raster::loadProjIdentity() {
_matProj = matrix4(1);
}
void Raster::loadViewMatrix(const matrix4& mat) {
_matView = mat;
}
void Raster::loadViewIdentity() {
_matView = matrix4(1);
}
void Raster::loadMatrix(const matrix4& mat) {
_matModel = mat;
}
@ -389,6 +482,19 @@ void Raster::loadIdentity() {
_matModel = matrix4(1);
}
void Raster::setPerspective(float fovy, float aspect, float zNear, float zFar) {
_matProj = perspective<float>(fovy, aspect, zNear, zFar);
}
void Raster::lookat(float3 const & eye, float3 const & center, float3 const & up) {
_matView = lookAt(eye, center, up);
}
void Raster::setViewPort(int x, int y, int w, int h) {
_viewPort.x = w;
_viewPort.y = h;
}
void Raster::bindTexture(Image* image) {
_texture = image;
}

17
src/7threed/Raster.h

@ -139,9 +139,18 @@ public:
void drawTriangle(const Vertex& vertex, Image* image);
void drawTriangle(Ege eges[3], Image* image);
void drawArrays(DRAWMODE pri, int start, int count);
float3 piplineTransform(float3 pos);
float3 piplineTransform2(float3 pos);
void bindTexture(Image* image);
void loadViewMatrix(const matrix4 &mat);
void loadViewIdentity();
void loadProjMatrix(const matrix4 &mat);
void loadProjIdentity();
void loadMatrix(const matrix4& mat);
void loadIdentity();
void setPerspective(float fovy, float aspect, float zNear, float zFar);
void lookat(float3 const & eye, float3 const & center, float3 const & up);
void setViewPort(int x, int y, int w, int h);
int size();
void clean();
bool setPixel(int x, int y, Rgba color);
@ -152,8 +161,14 @@ private:
int _height;
Rgba _color;
Image* _texture;
matrix4 _matModel;
matrix4 _matView;
matrix4 _matProj;
matrix4 _matProjView; // _matProj * _matView
float2 _viewPort;
Frustum _frust; //
DataElementDes _positionPointer;
DataElementDes _colorPointer;

44
src/7threed/threed.cc

@ -20,14 +20,39 @@ struct Vertex {
};
void example3() {
Vertex vertexs[] = {
{-1.0f, 0.0f, -2.0f, 0.0f, 0.0f, Rgba(255, 0, 0, 255)},
{ 0.0f, 1.0f, -9.0f, 1.0f, 1.0f, Rgba(0, 255, 0, 255)},
{ 1.0f, 0.0f, -2.0f, 1.0f, 0.0f, Rgba(0, 0, 255, 255)}
};
raster.loadIdentity();
Image* image = Image::loadFromFile("/home/blobt/Documents/dev/cpp/3dbase/image/scale.jpg");
raster.bindTexture(image);
raster.vertexPointer(2, DT_FLOAT, sizeof (Vertex), &vertexs[0].x);
raster.colorPointer(4, DT_BYTE, sizeof (Vertex), &vertexs[0].color);
raster.textureCoordPointer(2, DT_FLOAT, sizeof (Vertex), &vertexs[0].u);
raster.drawArrays(DM_TRIANGES, 0, 3);
}
/**
* if (!_frust.pointInFrustum(mp0) || _frust.pointInFrustum(mp1) || _frust.pointInFrustum(mp2)) {
//mp0 = piplineTransform(mp0);
//mp1 = piplineTransform(mp1);
//mp2 = piplineTransform2(mp2);
*
*/
void example2() {
Vertex vertexs[] = {
{10, 10, 0, 0.0f, 0.0f, Rgba(255, 0, 0, 255)},
{110, 110, 0, 1.0f, 1.0f, Rgba(255, 0, 0, 255)},
{110, 10, 0, 1.0f, 0.0f, Rgba(255, 0, 0, 255)},
{10, 10, 0, 0.0f, 0.0f, Rgba(255, 255, 255, 255)},
{10, 110, 0, 0.0f, 1.0f, Rgba(255, 255, 255, 255)},
{110, 110, 0, 1.0f, 1.0f, Rgba(255, 255, 255, 255)},
{110, 10, 0, 1.0f, 0.0f, Rgba(255, 0, 0, 255)}
};
raster.loadIdentity();
@ -41,11 +66,9 @@ void example3() {
raster.colorPointer(4, DT_BYTE, sizeof (Vertex), &vertexs[0].color);
raster.textureCoordPointer(2, DT_FLOAT, sizeof (Vertex), &vertexs[0].u);
raster.drawArrays(DM_TRIANGES, 0, 6);
raster.drawArrays(DM_TRIANGES, 0, 3);
}
unsigned char* makeBitmap() {
raster.clean();
@ -94,6 +117,11 @@ int main(int argc, char* argv[]) {
gtk_widget_show_all(window);
raster.setViewPort(0, 0, width, height);
raster.setPerspective(60, (float) (width) / (float) (height), 0.1, 1000);
gtk_main();
return 0;

Loading…
Cancel
Save