I'm using C++ and DirectX.
I want to make a tunnel in which the camera moves into the screen. It won't be a large tunnel, this is just for my game intro. This is the code I first wrote:



// global declarations
LPDIRECT3D9 d3d; // the pointer to our Direct3D interface
LPDIRECT3DDEVICE9 d3ddev; // the pointer to the device class
LPDIRECT3DVERTEXBUFFER9 v_buffer = NULL; // the pointer to the vertex buffer

//texture declerations
LPDIRECT3DTEXTURE9 texture_1; // the wall texture

struct CUSTOMVERTEX {FLOAT X, Y, Z; DWORD COLOR; FLOAT U, V;};
#define CUSTOMFVF (D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1)

// this is the function used to render a single frame
void render_frame(void)
{
static float movement = 0.0f;

d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
d3ddev->Clear(0, NULL, D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);

d3ddev->BeginScene();

// select which vertex format we are using
d3ddev->SetFVF(CUSTOMFVF);

// SET UP THE PIPELINE

D3DXMATRIX matView; // the view transform matrix

D3DXMatrixLookAtLH(&matView,
&D3DXVECTOR3 (0.0f, 0.0f, movement), // the camera position
&D3DXVECTOR3 (0.0f, 0.0f, movement+10.0f), // the look-at position
&D3DXVECTOR3 (0.0f, 1.0f, 0.0f)); // the up direction

movement+=0.1f;

d3ddev->SetTransform(D3DTS_VIEW, &matView); // set the view transform to matView

D3DXMATRIX matProjection; // the projection transform matrix

D3DXMatrixPerspectiveFovLH(&matProjection,
D3DXToRadian(45), // the horizontal field of view
(FLOAT)SCREEN_WIDTH / (FLOAT)SCREEN_HEIGHT, // aspect ratio
1.0f, // the near view-plane
100.0f); // the far view-plane

d3ddev->SetTransform(D3DTS_PROJECTION, &matProjection); // set the projection

// select the vertex buffer to display
d3ddev->SetStreamSource(0, v_buffer, 0, sizeof(CUSTOMVERTEX));

// set the texture
d3ddev->SetTexture(0, texture_1);

// copy the vertex buffer to the back buffer
d3ddev->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);
d3ddev->DrawPrimitive(D3DPT_TRIANGLESTRIP, 4, 2);
d3ddev->DrawPrimitive(D3DPT_TRIANGLESTRIP, 8, 2);
d3ddev->DrawPrimitive(D3DPT_TRIANGLESTRIP, 12, 2);

d3ddev->DrawPrimitive(D3DPT_TRIANGLESTRIP, 16, 2);
d3ddev->DrawPrimitive(D3DPT_TRIANGLESTRIP, 20, 2);
d3ddev->DrawPrimitive(D3DPT_TRIANGLESTRIP, 24, 2);
d3ddev->DrawPrimitive(D3DPT_TRIANGLESTRIP, 28, 2);

d3ddev->EndScene();

d3ddev->Present(NULL, NULL, NULL, NULL);

return;
}

// this is the function that puts the 3D models into video RAM
void init_graphics(void)
{
// load the texture we will use

D3DXCreateTextureFromFile(d3ddev,
L"wall.png",
&texture_1);

// create the vertices using the CUSTOMVERTEX struct
struct CUSTOMVERTEX vertices[]=
{
//tunnel #1
//left wall
{ -3.0f, 3.0f, 10.0f, D3DCOLOR_XRGB(255, 255, 255),1 , 0,},
{ -3.0f, 3.0f, 55.0f, D3DCOLOR_XRGB(255, 255, 255),0 , 0,},
{ -3.0f, -3.0f, 10.0f, D3DCOLOR_XRGB(255, 255, 255), 1, 1,},
{ -3.0f, -3.0f, 55.0f, D3DCOLOR_XRGB(255, 255, 255), 0, 1},

//ceiling
{ -3.0f, 3.0f, 10.0f, D3DCOLOR_XRGB(255, 255, 255), 1, 0,},
{ 3.0f, 3.0f, 10.0f, D3DCOLOR_XRGB(255, 255, 255), 0 , 0,},
{ -3.0f, 3.0f, 55.0f, D3DCOLOR_XRGB(255, 255, 255), 1, 1,},
{ 3.0f, 3.0f, 55.0f, D3DCOLOR_XRGB(255, 255, 255), 0, 1,},

//right wall
{ 3.0f, 3.0f, 55.0f, D3DCOLOR_XRGB(255, 255, 255), 1, 0,},
{ 3.0f, 3.0f, 10.0f, D3DCOLOR_XRGB(255, 255, 255), 0, 0,},
{ 3.0f, -3.0f, 55.0f, D3DCOLOR_XRGB(255, 255, 255), 1, 1,},
{ 3.0f, -3.0f, 10.0f, D3DCOLOR_XRGB(255, 255, 255), 0, 1,},

//floor
{ -3.0f, -3.0f, 55.0f, D3DCOLOR_XRGB(255, 255, 255), 1, 0,},
{ 3.0f, -3.0f, 55.0f, D3DCOLOR_XRGB(255, 255, 255), 0, 0,},
{ -3.0f, -3.0f, 10.0f, D3DCOLOR_XRGB(255, 255, 255), 1, 1,},
{ 3.0f, -3.0f, 10.0f, D3DCOLOR_XRGB(255, 255, 255), 0, 1,},

//tunnel #2
//left wall
{ -3.0f, 3.0f, 55.0f, D3DCOLOR_XRGB(255, 255, 255),1 , 0,},
{ -3.0f, 3.0f, 100.0f, D3DCOLOR_XRGB(255, 255, 255),0 , 0,},
{ -3.0f, -3.0f, 55.0f, D3DCOLOR_XRGB(255, 255, 255), 1, 1,},
{ -3.0f, -3.0f, 100.0f, D3DCOLOR_XRGB(255, 255, 255), 0, 1},

//ceiling
{ -3.0f, 3.0f, 55.0f, D3DCOLOR_XRGB(255, 255, 255), 1, 0,},
{ 3.0f, 3.0f, 55.0f, D3DCOLOR_XRGB(255, 255, 255), 0 , 0,},
{ -3.0f, 3.0f, 100.0f, D3DCOLOR_XRGB(255, 255, 255), 1, 1,},
{ 3.0f, 3.0f, 100.0f, D3DCOLOR_XRGB(255, 255, 255), 0, 1,},

//right wall
{ 3.0f, 3.0f, 100.0f, D3DCOLOR_XRGB(255, 255, 255), 1, 0,},
{ 3.0f, 3.0f, 55.0f, D3DCOLOR_XRGB(255, 255, 255), 0, 0,},
{ 3.0f, -3.0f, 100.0f, D3DCOLOR_XRGB(255, 255, 255), 1, 1,},
{ 3.0f, -3.0f, 55.0f, D3DCOLOR_XRGB(255, 255, 255), 0, 1,},

//floor
{ -3.0f, -3.0f, 100.0f, D3DCOLOR_XRGB(255, 255, 255), 1, 0,},
{ 3.0f, -3.0f, 100.0f, D3DCOLOR_XRGB(255, 255, 255), 0, 0,},
{ -3.0f, -3.0f, 55.0f, D3DCOLOR_XRGB(255, 255, 255), 1, 1,},
{ 3.0f, -3.0f, 55.0f, D3DCOLOR_XRGB(255, 255, 255), 0, 1,},

};

// create a vertex buffer interface called v_buffer
d3ddev->CreateVertexBuffer(32*sizeof(CUSTOMVERTEX),
0,
CUSTOMFVF,
D3DPOOL_MANAGED,
&v_buffer,
NULL);

VOID* pVoid; // a void pointer

// lock v_buffer and load the vertices into it
v_buffer->Lock(0, 0, (void**)&pVoid, 0);
memcpy(pVoid, vertices, sizeof(vertices));
v_buffer->Unlock();

return;
}



As you can see, I seperated the vertices of the tunnel into 2 tunnels, because the texture would stretch too much if I had one tunnel of 100.0 depth. However, it is still somewhat stretched. That's why I decided to make the tunnel a combination of multiple small tunnels. I also wanted to make it a bit longer. So, I changed the code as follows:



// global declarations
LPDIRECT3D9 d3d; // the pointer to our Direct3D interface
LPDIRECT3DDEVICE9 d3ddev; // the pointer to the device class
LPDIRECT3DVERTEXBUFFER9 v_buffer = NULL; // the pointer to the vertex buffer

//texture declerations
LPDIRECT3DTEXTURE9 texture_1; // the wall texture

struct CUSTOMVERTEX
{
CUSTOMVERTEX(FLOAT fx, FLOAT fy, FLOAT fz, DWORD dwcolor, FLOAT fu, FLOAT fv) :
X(fx), Y(fy), Z(fz), COLOR(dwcolor), U(fu), V(fv) {}
FLOAT X, Y, Z;
DWORD COLOR;
FLOAT U, V;
};

#define CUSTOMFVF (D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1)

// this is the function used to render a single frame
void render_frame(void)
{
static float movement = 0.0f;

d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
d3ddev->Clear(0, NULL, D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);

d3ddev->BeginScene();

// select which vertex format we are using
d3ddev->SetFVF(CUSTOMFVF);

// SET UP THE PIPELINE
D3DXMATRIX matView; // the view transform matrix

D3DXMatrixLookAtLH(&matView,
&D3DXVECTOR3 (0.0f, 0.0f, movement), // the camera position
&D3DXVECTOR3 (0.0f, 0.0f, movement+10.0f), // the look-at position
&D3DXVECTOR3 (0.0f, 1.0f, 0.0f)); // the up direction

movement+=0.1f;

d3ddev->SetTransform(D3DTS_VIEW, &matView); // set the view transform to matView

D3DXMATRIX matProjection; // the projection transform matrix

D3DXMatrixPerspectiveFovLH(&matProjection,
D3DXToRadian(45), // the horizontal field of view
(FLOAT)SCREEN_WIDTH / (FLOAT)SCREEN_HEIGHT, // aspect ratio
1.0f, // the near view-plane
100.0f); // the far view-plane

d3ddev->SetTransform(D3DTS_PROJECTION, &matProjection); // set the projection

// select the vertex buffer to display
d3ddev->SetStreamSource(0, v_buffer, 0, sizeof(CUSTOMVERTEX));

// set the texture
d3ddev->SetTexture(0, texture_1);

// copy the vertex buffer to the back buffer
int i;
for (i=0;i<40;i++)
{
d3ddev->DrawPrimitive(D3DPT_TRIANGLESTRIP, i*4, 2);
}


d3ddev->EndScene();

d3ddev->Present(NULL, NULL, NULL, NULL);

return;
}

// this is the function that puts the 3D models into video RAM
void init_graphics(void)
{
// load the texture we will use

D3DXCreateTextureFromFile(d3ddev,
L"wall.png",
&texture_1);

float depth = 10.0f;
struct CUSTOMVERTEX* vertices[160];

// create the vertices using the CUSTOMVERTEX struct
int i;
for (i=0;i < 145;i+=16)
{
//left wall
vertices[i] = new CUSTOMVERTEX(-3.0f, 3.0f, depth, D3DCOLOR_XRGB(255, 255, 255),1 , 0);

vertices[i+1] = new CUSTOMVERTEX(-3.0f, 3.0f, depth + 25.0f, D3DCOLOR_XRGB(255, 255, 255),0 , 0);
vertices[i+2] = new CUSTOMVERTEX(-3.0f, -3.0f, depth, D3DCOLOR_XRGB(255, 255, 255), 1, 1);
vertices[i+3] = new CUSTOMVERTEX(-3.0f, -3.0f, depth + 25.0f, D3DCOLOR_XRGB(255, 255, 255), 0, 1);

//ceiling
vertices[i+4] = new CUSTOMVERTEX(-3.0f, 3.0f, depth, D3DCOLOR_XRGB(255, 255, 255), 1, 0);
vertices[i+5] = new CUSTOMVERTEX(3.0f, 3.0f, depth, D3DCOLOR_XRGB(255, 255, 255), 0 , 0);
vertices[i+6] = new CUSTOMVERTEX(-3.0f, 3.0f, depth + 25.0f, D3DCOLOR_XRGB(255, 255, 255), 1, 1);
vertices[i+7] = new CUSTOMVERTEX(3.0f, 3.0f, depth + 25.0f, D3DCOLOR_XRGB(255, 255, 255), 0, 1);

//right wall
vertices[i+8] = new CUSTOMVERTEX(3.0f, 3.0f, depth + 25.0f, D3DCOLOR_XRGB(255, 255, 255), 1, 0);
vertices[i+9] = new CUSTOMVERTEX(3.0f, 3.0f, depth, D3DCOLOR_XRGB(255, 255, 255), 0, 0);
vertices[i+10] = new CUSTOMVERTEX(3.0f, -3.0f, depth + 25.0f, D3DCOLOR_XRGB(255, 255, 255), 1, 1);
vertices[i+11] = new CUSTOMVERTEX(3.0f, -3.0f, depth, D3DCOLOR_XRGB(255, 255, 255), 0, 1);

//floor
vertices[i+12] = new CUSTOMVERTEX(-3.0f, -3.0f, depth + 25.0f, D3DCOLOR_XRGB(255, 255, 255), 1, 0);
vertices[i+13] = new CUSTOMVERTEX(3.0f, -3.0f, depth + 25.0f, D3DCOLOR_XRGB(255, 255, 255), 0, 0);
vertices[i+14] = new CUSTOMVERTEX(-3.0f, -3.0f, depth, D3DCOLOR_XRGB(255, 255, 255), 1, 1);
vertices[i+15] = new CUSTOMVERTEX(3.0f, -3.0f, depth, D3DCOLOR_XRGB(255, 255, 255), 0, 1);

depth +=25.0f;
}

// create a vertex buffer interface called v_buffer
d3ddev->CreateVertexBuffer(160*sizeof(CUSTOMVERTEX),
0,
CUSTOMFVF,
D3DPOOL_MANAGED,
&v_buffer,
NULL);

VOID* pVoid; // a void pointer

// lock v_buffer and load the vertices into it
v_buffer->Lock(0, 0, (void**)&pVoid, 0);
memcpy(pVoid, vertices, sizeof(vertices));
v_buffer->Unlock();

return;
}



I have left out the code that has to do with the window and the D3D initializations and I've only included the functions that I have made changes in.
My first try (with the 2 seperate tunnels) worked just fine. But the second code just gives an empty window. One of my assumptions is it may have to do with the fact that in the second code "vertices" is a pointer. But it threw an error if i just declared a variable.

Anyone knows what the problem is?