0
votes

So I'm supposed to Texture Map a specific model I've loaded into a scene (with a Framebuffer and a Planar Pinhole Camera), however I'm not allowed to use OpenGL and I have no idea how to do it otherwise (we do use glDrawPixels for other functionality, but that's the only function we can use).

Is anyone here able enough to give me a run-through on how to texture map without OpenGL functionality?

I'm supposed to use these slides: https://www.cs.purdue.edu/cgvlab/courses/334/Fall_2014/Lectures/TMapping.pdf

But they make very little sense to me.

What I've gathered so far is the following:

You iterate over a model, and assign each triangle "texture coordinates" (which I'm not sure what those are), and then use "model space interpolation" (again, I don't understand what that is) to apply the texture with the right perspective.

I currently have my program doing the following:

Teapot

TL;DR: 1. What is model space interpolation/how do I do it? 2. What explicitly are texture coordinates? 3. How, on a high level (in layman's terms) do I texture map a model without using OpenGL.

2
Essentially you have to recreating what OpenGL does internally. Texture coordinates is something you have to somehow come up with (either specify them explicitly with the model or generate them based on e.g. the model's geometry). OpenGL requires to be supplied with texture coordinates either. The rest is actually quite basic stuff. I suggest you read the OpenGL-1.4 specification on texture application, namely how the fixed function pipeline does it. While the slides don't explain each and every step, but they carry all the information you need, given one knows how e.g. interpolation works.datenwolf

2 Answers

1
votes

OK, let's start by making sure we're both on the same page about how the color interpolation works. Lines 125 through 143 set up three vectors redABC, greenABC and blueABC that are used to interpolate the colors across the triangle. They work one color component at a time, and each of the three vectors helps interpolate one color component.

By convention, s,t coordinates are in source texture space. As provided in the mesh data, they specify the position within the texture of that particular vertex of the triangle. The crucial thing to understand is that s,t coordinates need to be interpolated across the triangle just like colors.

So, what you want to do is set up two more ABC vectors: sABC and tABC, exactly duplicating the logic used to set up redABC, but instead of using the color components of each vertex, you just use the s,t coordinates of each vertex. Then for each pixel, instead of computing ssiRed etc. as unsigned int values, you compute ssis and ssit as floats, they should be in the range 0.0f through 1.0f assuming your source s,t values are well behaved.

Now that you have an interpolated s,t coordinate, multiply ssis by the texel width of the texture, and ssit by the texel height, and use those coordinates to fetch the texel. Then just put that on the screen.

0
votes

Since you are not using OpenGL I assume you wrote your own software renderer to render that teapot?

A texture is simply an image. A texture coordinate is a 2D position in the texture. So (0,0) is bottom-left and (1,1) is top-right. For every vertex of your 3D model you should store a 2D position (u,v) in the texture. That means that at that vertex, you should use the colour the texture has at that point.

To know the UV texture coordinate of a pixel in between vertices you need to interpolate the texture coordinates of the vertices around it. Then you can use that UV to look up the colour in the texture.