Browse Source

修复了uv读取

master
blobt 5 years ago
parent
commit
7fb491fc89
  1. 6
      src/texture/Image.cc
  2. 55
      src/texture/Raster.cc
  3. 1
      src/texture/Raster.h
  4. 18
      src/texture/texture.cc

6
src/texture/Image.cc

@ -36,9 +36,9 @@ Rgba Image::pixelAt(int x, int y) const {
}
Rgba Image::pixelUv(float u, float v) const {
int x = u * _width;
int y = v * _height;
int x = (u * _width) -1; //不管_width还是_height都是从0开始的,
int y = (v * _height) -1;//所以这里要减去1
return pixelAt(x, y);
//return Rgba(255,0,0);
}

55
src/texture/Raster.cc

@ -32,6 +32,52 @@ Raster::~Raster() {
delete buffer;
}
void Raster::drawLine(float2 p1, float2 p2, Rgba color) {
float xOffer = p1.x - p2.x;
float yOffer = p1.y - p2.y;
float xStart, xEnd, yStart, yEnd;
if (xOffer == 0 && yOffer == 0) {
setPixel(p1.x, p1.y, color);
}
if (fabs(xOffer) > fabs(yOffer)) {
if (p1.x < p2.x) {
xStart = p1.x;
xEnd = p2.x;
yEnd = p2.y;
} else {
xStart = p2.x;
xEnd = p1.x;
yEnd = p1.y;
}
float slope = yOffer / xOffer;
for (float i = xStart; i < xEnd; i += 1.0) {
float q = yEnd - slope * (xEnd - i);
setPixel(i, q, color);
}
} else {
if (p1.y < p2.y) {
yStart = p1.y;
yEnd = p2.y;
xEnd = p2.x;
} else {
yStart = p2.y;
yEnd = p1.y;
xEnd = p1.x;
}
float slope = xOffer / yOffer;
for (float i = yStart; i < yEnd; i += 1.0) {
float q = xEnd - slope * (yEnd - i);
setPixel(q, i, color);
}
}
}
void Raster::drawPoint(int x, int y, Rgba color, int pointSize) {
switch (pointSize) {
case 1:
@ -85,7 +131,7 @@ void Raster::drawSpan(const Span &span, Image* image) {
} else {
scale = (float) (i - startX) / length;
}
uv = uvLerp(span.uvStart, span.uvEnd, scale);
color = image->pixelUv(uv.x, uv.y);
@ -127,7 +173,7 @@ void Raster::drawEge(const Ege& e1, const Ege& e2, Image* image) {
}
uvE2 = uvLerp(e2.uv2, e2.uv1, scale2);
scale2 += setp2;
//setPixel(x2, y, e2.color2);
//setPixel(x2, y, Rgba(255,0,0));
int x1;
@ -138,9 +184,9 @@ void Raster::drawEge(const Ege& e1, const Ege& e2, Image* image) {
}
uvE1 = uvLerp(e1.uv2, e1.uv1, scale1);
scale1 += setp1;
//setPixel(x1, y, e1.color2);
//setPixel(x1, y, Rgba(255,0,0));
Span span(x1, x2, y, Rgba(255,255,255), Rgba(255,255,255), uvE1, uvE2);
Span span(x1, x2, y, Rgba(255, 255, 255), Rgba(255, 255, 255), uvE1, uvE2);
drawSpan(span, image);
}
}
@ -166,6 +212,7 @@ void Raster::drawTriangle(const Vertex& vertex, Image* image) {
for (int i = 1; i < 3; i++) {
curLength = eges[i].y2 - eges[i].y1;
if (curLength > length) {
length = curLength;
iMax = i;
}
}

1
src/texture/Raster.h

@ -114,6 +114,7 @@ public:
Rgba* buffer;
Raster(int width, int height);
virtual ~Raster();
void drawLine(float2 p1, float2 p2, Rgba color);
void drawPoint(int x, int y, Rgba color = Rgba(255, 0, 0, 0), int pointSize = 1);
void drawSpan(const Span &span, Image* image);
void drawEge(const Ege& e1, const Ege& e2, Image* image);

18
src/texture/texture.cc

@ -20,13 +20,14 @@ Raster raster(width, height);
void example() {
Image* image = Image::loadFromFile("/home/blobt/Documents/dev/cpp/3dbase/image/scale.jpg");
Raster::Vertex ver1 = {
int2(10, 10), float2(0.0f, 0.0f), Rgba(),
int2(10, 110), float2(0.0f, 1.0f), Rgba(),
int2(110, 10), float2(1.0f, 0.0f), Rgba()
};
Raster::Vertex ver1 = {
int2(10, 10), float2(0.0f, 0.0f), Rgba(),
int2(10, 110), float2(0.0f, 1.0f), Rgba(),
int2(110, 10), float2(1.0f, 0.0f), Rgba()
};
raster.drawTriangle(ver1, image);
raster.drawTriangle(ver1, image);
Raster::Vertex ver2 = {
@ -37,6 +38,11 @@ void example() {
raster.drawTriangle(ver2, image);
// raster.drawPoint(10, 110, Rgba(255, 0, 0, 0), 3);
// raster.drawPoint(110, 10, Rgba(255, 0, 0, 0), 3);
//raster.drawLine(float2(10, 110), float2(110, 10), Rgba(255, 255, 255));
delete image;
}

Loading…
Cancel
Save