0
내 프로그램이 화면에 아무 것도 표시하지 않습니다. 나는 여러 가지를 시도했지만 아무 것도 효과가 없었다.OpenGL이 전혀 렌더링하지 않음
Renderer.cpp :
이#include "Renderer.h"
Renderer::Renderer(Camera& camera, float w, float h)
:
cam(camera),
winW(w),
winH(h)
{}
Renderer::~Renderer()
{
glDeleteBuffers(1, &quad);
glDeleteBuffers(1, &color);
glDeleteBuffers(1, &UV);
glDeleteVertexArrays(1, &vao);
}
void Renderer::load()
{
projectionMatrix = glm::mat4(1.0f);
projectionMatrix = glm::perspective<float>(45.0f, (float) winW/(float) winH, 0.01f, 100.0f);
shader.loadAndCompile("Res/Shaders/std.vs", "Res/Shaders/std.fs");
texture.loadTexture("Res/Tex/sheet.png");
texture.bind();
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
Vertex quadArray[] = {
{ -0.5, -0.5, 0.0 },
{ -0.5, 0.5, 0.0 },
{ 0.5, -0.5, 0.0 },
{ 0.5, -0.5, 0.0 },
{ 0.5, 0.5, 0.0 },
{ -0.5, 0.5, 0.0 }
};
glUseProgram(shader.getProgram());
MVPLocation = glGetUniformLocation(shader.getProgram(), "MVP");
glGenBuffers(1, &quad);
glBindBuffer(GL_ARRAY_BUFFER, quad);
glBufferData(GL_ARRAY_BUFFER, sizeof(quadArray), quadArray, GL_STATIC_DRAW);
glGenBuffers(1, &color);
glBindBuffer(GL_ARRAY_BUFFER, color);
glBufferData(GL_ARRAY_BUFFER, 48, NULL, GL_STREAM_DRAW);
glGenBuffers(1, &UV);
glBindBuffer(GL_ARRAY_BUFFER, UV);
glBufferData(GL_ARRAY_BUFFER, 48, NULL, GL_STREAM_DRAW);
}
void Renderer::translate(glm::vec3 pos)
{
this->transMatrix = glm::translate(glm::mat4(1.0f), pos);
}
void Renderer::translate(float x, float y, float z)
{
translate(glm::vec3(x, y, z));
}
void Renderer::rotate(float angle, glm::vec3 axis)
{
this->rotationMatrix = glm::rotate(glm::mat4(1.0f), angle, axis);
}
void Renderer::scale(glm::vec3 scale)
{
this->scaleMatrix = glm::scale(glm::mat4(1.0f), scale);
}
void Renderer::scale(float x, float y, float z)
{
scale(glm::vec3(x, y, z));
}
void Renderer::drawSpriteBillboarded(glm::vec3 pos, glm::vec3 lookAtPos, int w, int h, int uP, int vP, glm::vec4 col)
{
int texW = texture.getWidth(), texH = texture.getHeight();
float u = (float) uP/(float) texW, v = (float) vP/(float) texH, uEnd = (float) (uP + w)/(float) texW, vEnd = (float) (vP + h)/(float) texH;
Color colArray[] = {
{ col.r, col.g, col.b, col.a },
{ col.r, col.g, col.b, col.a },
{ col.r, col.g, col.b, col.a },
{ col.r, col.g, col.b, col.a },
{ col.r, col.g, col.b, col.a },
{ col.r, col.g, col.b, col.a }
};
Vertex uvArray[] = {
{ u, v },
{ u, vEnd },
{ uEnd, v },
{ uEnd, v },
{ uEnd, vEnd },
{ u, vEnd }
};
translate(pos);
glm::vec2 dist = glm::vec2(lookAtPos.x, lookAtPos.z) - glm::vec2(pos.x, pos.z);
rotate(atan2f(dist.y, dist.x), glm::vec3(0, 1, 0));
scale(w/16 * 1.0, h/16 * 1.0, 1.0);
modelMatrix = transMatrix * rotationMatrix * scaleMatrix;
camTransMatrix = glm::translate(glm::mat4(1.0f), cam.getPos());
camRotationMatrix = glm::rotate(camRotationMatrix, cam.getRotX(), glm::vec3(1, 0, 0));
camRotationMatrix = glm::rotate(camRotationMatrix, cam.getRotY(), glm::vec3(0, 1, 0));
camRotationMatrix = glm::rotate(camRotationMatrix, cam.getRotZ(), glm::vec3(0, 0, 1));
viewMatrix = camTransMatrix * camRotationMatrix;
modelViewProjectionMatrix = projectionMatrix * viewMatrix * modelMatrix;
glUniformMatrix4fv(MVPLocation, 1, GL_FALSE, &modelViewProjectionMatrix[ 0 ][ 0 ]);
glBindBuffer(GL_ARRAY_BUFFER, quad);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*) 0);
glBindBuffer(GL_ARRAY_BUFFER, color);
glBufferData(GL_ARRAY_BUFFER, sizeof(colArray), colArray, GL_STREAM_DRAW);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, (void*)0);
glBindBuffer(GL_ARRAY_BUFFER, UV);
glBufferData(GL_ARRAY_BUFFER, sizeof(uvArray), uvArray, GL_STREAM_DRAW);
glEnableVertexAttribArray(2);
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 0, (void*)0);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0);
}
void Renderer::drawSprite(glm::vec3 pos, int w, int h, int uP, int vP, glm::vec4 col)
{}
버텍스 쉐이더가
#version 330 core
layout(location = 0) in vec3 vertPosition;
layout(location = 1) in vec4 color;
layout(location = 2) in vec2 in_UV;
uniform mat4 MVP;
out vec4 col;
out vec2 uv;
void main(void)
{
gl_Position = MVP * vec4(vertPosition, 1.0);
col = color;
uv = in_UV;
}
조각 쉐이더
#version 330 core
in vec4 col;
in vec2 uv;
out vec4 color;
uniform sampler2D tex;
void main(void)
{
vec4 Color = texture2D(tex, uv) * col;
color = Color;
}
나는 drawSprit 전화
다음 내 소스, 버텍스와 프래그먼트 쉐이더의 지금처럼 내 게임 클래스에서 기능을 eBillboarded : 0, 0, 0내가 MVP 행렬 곱하지 버텍스 쉐이더를 변경 시도도 변경 해봤에서
drawSpriteBillboarded(glm::vec3(0, 0, -5), cam.getPos(), 16, 16, 0, 0, glm::vec3(255, 255, 255, 255));
카메라의 위치입니다 프래그먼트 쉐이더를 다음으로 변경하십시오.
#version 330 core
in vec4 col;
in vec2 uv;
out vec4 color;
void main(void)
{
color = vec4(1.0, 1.0, 1.0, 1.0);
}
그러나 아무 것도 표시되지 않습니다. 나는 또한 GL_TRIANGLES
을 GL_POINTS
으로 변경하려고 시도했지만 아무 것도하지 않았습니다.
void Shader::loadAndCompile(const char* vertPath, const char* fragPath)
{
std::string vsCode = "";
std::ifstream vsStream(vertPath, std::ios::in);
fprintf(stdout, "loading vertex shader %s\n", vertPath);
if(vsStream.is_open())
{
std::string line;
while(std::getline(vsStream, line))
vsCode += line + '\n';
vsStream.close();
}
else
{
fprintf(stderr, "Error: could not find vertex shader %s\n", vertPath);
return;
}
std::string fsCode = "";
std::ifstream fsStream(fragPath, std::ios::in);
fprintf(stdout, "loading fragment shader %s\n", fragPath);
if(fsStream.is_open())
{
std::string line;
while(std::getline(fsStream, line))
fsCode += line + '\n';
fsStream.close();
}
else
{
fprintf(stderr, "Error: could not find fragment shader %s\n", fragPath);
return;
}
fprintf(stdout, "Compiling vertexShader %s\n", vertPath);
const char* vertCode = vsCode.c_str();
GLuint vertShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertShader, 1, &vertCode, NULL);
glCompileShader(vertShader);
GLint result = GL_FALSE;
int infoLogLength;
glGetShaderiv(vertShader, GL_COMPILE_STATUS, &result);
glGetShaderiv(vertShader, GL_INFO_LOG_LENGTH, &infoLogLength);
if(infoLogLength > 0)
{
std::vector<char> errorMsg(infoLogLength);
glGetShaderInfoLog(vertShader, infoLogLength, NULL, &errorMsg[ 0 ]);
fprintf(stderr, "%s\n", &errorMsg[ 0 ]);
}
fprintf(stdout, "Compiling fragmentShader %s\n", fragPath);
const char* fragCode = fsCode.c_str();
GLuint fragShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragShader, 1, &fragCode, NULL);
glCompileShader(fragShader);
glGetShaderiv(fragShader, GL_COMPILE_STATUS, &result);
glGetShaderiv(fragShader, GL_INFO_LOG_LENGTH, &infoLogLength);
if(infoLogLength > 0)
{
std::vector<char> errorMsg(infoLogLength);
glGetShaderInfoLog(fragShader, infoLogLength, NULL, &errorMsg[ 0 ]);
fprintf(stderr, "%s\n", &errorMsg[ 0 ]);
}
fprintf(stdout, "Linking program...\n");
GLuint tmpProgID = glCreateProgram();
glAttachShader(tmpProgID, vertShader);
glAttachShader(tmpProgID, fragShader);
glLinkProgram(tmpProgID);
glGetProgramiv(tmpProgID, GL_LINK_STATUS, &result);
glGetProgramiv(tmpProgID, GL_INFO_LOG_LENGTH, &infoLogLength);
if(infoLogLength > 0)
{
std::vector<char> errorMsg(infoLogLength);
glGetProgramInfoLog(tmpProgID, infoLogLength, NULL, &errorMsg[ 0 ]);
fprintf(stderr, "%s\n", &errorMsg[ 0 ]);
}
glDeleteShader(vertShader);
glDeleteShader(fragShader);
this->programID = tmpProgID;
}
그래서 나는 기본적으로 내가 (바보) 실수 있는지 확인하기 위해 내 코드를 확인을 부탁 해요 :
편집
나는 또한 loadAndCompile() 함수를 추가했다.
적어도 흰색 화면이 표시 되나요? 당신이 얻는 결과는 무엇입니까? 셰이더 로그가로드되고 있는지 확인하려고 했습니까? – zero298
예, 그들은 그들이해야하는 길을로드하고 있습니다. – Potte
당신의 함수는'loadAndCompile (...)'만 호출 **로드 및 컴파일 **하거나 *** 링크 *** 귀하의 쉐이더합니까? 교복은 당신이 링크 할 때까지 위치를 가지지 않을 것이고,'glUseProgram (...)'은 아직 링크되지 않은 프로그램으로 그것을하려고하면 에러를 발생시킬 것이다. –