编译器提供了语法错误,这些语法错误在VisualStudio中未显示。我能做什么? 我打算在C++中自学OpenGL,VisualStudio说我的代码是可以的。但是如果我编译代码,我会得到很多语法错误。我真的不明白
以下是错误消息:编译器提供了语法错误,这些语法错误在VisualStudio中未显示。我能做什么? 我打算在C++中自学OpenGL,VisualStudio说我的代码是可以的。但是如果我编译代码,我会得到很多语法错误。我真的不明白,c++,c++11,opengl,error-handling,compiler-errors,C++,C++11,Opengl,Error Handling,Compiler Errors,以下是错误消息: 1>------ Erstellen gestartet: Projekt: OpenGL, Konfiguration: Release Win32 ------ 1>Application.cpp 1>C:\Users\schko\source\repos\OpenGL\OpenGL\src\Engine.h(50,25): error C2061: Syntaxfehler: Bezeichner "Renderer" 1>C:\Users\sch
1>------ Erstellen gestartet: Projekt: OpenGL, Konfiguration: Release Win32 ------
1>Application.cpp
1>C:\Users\schko\source\repos\OpenGL\OpenGL\src\Engine.h(50,25): error C2061: Syntaxfehler: Bezeichner "Renderer"
1>C:\Users\schko\source\repos\OpenGL\OpenGL\src\Application.cpp(35,33): error C2660: "Engine::gameLoop": Funktion akzeptiert keine 3 Argumente
1>C:\Users\schko\source\repos\OpenGL\OpenGL\src\Engine.h(50,7): message : Siehe Deklaration von "Engine::gameLoop"
1>Buffers.cpp
1>C:\Users\schko\source\repos\OpenGL\OpenGL\src\Renderer.h(13,26): error C3646: "parseShader": Unbekannter Überschreibungsspezifizierer
1>C:\Users\schko\source\repos\OpenGL\OpenGL\src\Renderer.h(13,26): error C2059: Syntaxfehler: "("
1>C:\Users\schko\source\repos\OpenGL\OpenGL\src\Renderer.h(13,54): error C2238: Unerwartete(s) Token vor ";"
1>C:\Users\schko\source\repos\OpenGL\OpenGL\src\Renderer.h(22,39): error C2061: Syntaxfehler: Bezeichner "GameVars"
1>Engine.cpp
1>C:\Users\schko\source\repos\OpenGL\OpenGL\src\Renderer.h(13,26): error C3646: "parseShader": Unbekannter Überschreibungsspezifizierer
1>C:\Users\schko\source\repos\OpenGL\OpenGL\src\Renderer.h(13,26): error C2059: Syntaxfehler: "("
1>C:\Users\schko\source\repos\OpenGL\OpenGL\src\Renderer.h(13,54): error C2238: Unerwartete(s) Token vor ";"
1>C:\Users\schko\source\repos\OpenGL\OpenGL\src\Renderer.h(22,39): error C2061: Syntaxfehler: Bezeichner "GameVars"
1>C:\Users\schko\source\repos\OpenGL\OpenGL\src\Engine.cpp(72,12): error C2660: "Renderer::render": Funktion akzeptiert keine 2 Argumente
1>C:\Users\schko\source\repos\OpenGL\OpenGL\src\Renderer.h(22,7): message : Siehe Deklaration von "Renderer::render"
1>Renderer.cpp
1>C:\Users\schko\source\repos\OpenGL\OpenGL\src\Engine.h(50,25): error C2061: Syntaxfehler: Bezeichner "Renderer"
1>Die Erstellung des Projekts "OpenGL.vcxproj" ist abgeschlossen -- FEHLER.
========== Erstellen: 0 erfolgreich, 1 fehlerhaft, 0 aktuell, 0 übersprungen ==========
这是我的密码
Application.cpp:
#include "Buffers.h"
#include "Renderer.h"
#include "Engine.h"
int main()
{
float vertices[] =
{
-0.5f, -0.5f, // 0
0.5f, -0.5f, // 1
0.5f, 0.5f, // 2
-0.5f, 0.5f // 3
};
unsigned int indices[] =
{
0, 1, 2,
2, 3, 0
};
Buffers buff(vertices, indices, 4 * 2, 6);
Renderer r;
Engine engine;
if (engine.err != 0)
return -1;
float g = 0.0f;
float b = 1.0f;
float iG = 0.05f;
float iB = -0.05f;
GameVars vars = { 0.0f, g, b, 1.0f };
engine.gameLoop(r, buff, engine);
while (!engine.terminated)
{
if (g > 1.0f)
iG = -0.005f;
else if (g < 0.0f)
iG = 0.005f;
if (b > 1.0f)
iB = -0.005f;
else if (b < 0.0f)
iB = 0.005f;
g += iG;
b += iB;
engine.setVars({ 0.0f, g, b, 1.0f });
}
buff.~Buffers();
r.~Renderer();
engine.~Engine();
return 0;
}
Buffers.cpp:
#include "Buffers.h"
#include "Engine.h"
Buffers::Buffers(const void* vertices, const unsigned int* indices, unsigned int vertexCount, unsigned int indexCount)
: m_iCount(indexCount)
{
ASSERT(sizeof(unsigned int) == sizeof(GLuint));
GLCall(glGenVertexArrays(1, &m_vaoID));
GLCall(glBindVertexArray(m_vaoID));
GLCall(glGenBuffers(1, &m_vBuffID));
GLCall(glBindBuffer(GL_ARRAY_BUFFER, m_vBuffID));
GLCall(glBufferData(GL_ARRAY_BUFFER, vertexCount * sizeof(float), vertices, GL_STATIC_DRAW));
GLCall(glEnableVertexAttribArray(0));
GLCall(glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), 0));
GLCall(glGenBuffers(1, &m_iBuffID));
GLCall(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_iBuffID));
GLCall(glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexCount * sizeof(GLuint), indices, GL_STATIC_DRAW));
GLCall(glBindBuffer(GL_ARRAY_BUFFER, 0));
}
Buffers::~Buffers()
{
GLCall(glDeleteBuffers(1, &m_iBuffID));
GLCall(glDeleteBuffers(1, &m_vBuffID));
GLCall(glDeleteVertexArrays(1, &m_vaoID));
}
void Buffers::bind() const
{
GLCall(glBindVertexArray(m_vaoID));
GLCall(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_iBuffID));
}
void Buffers::unbind() const
{
GLCall(glBindVertexArray(0));
GLCall(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0));
}
缓冲区。h:
#pragma once
class Buffers
{
private:
unsigned int m_iBuffID;
unsigned int m_vBuffID;
unsigned int m_vaoID;
unsigned int m_iCount;
public:
Buffers(const void* vertices, const unsigned int* indices, unsigned int vertexCount, unsigned int indexCount);
~Buffers();
void bind() const;
void unbind() const;
inline unsigned int getIndexCount() { return m_iCount; }
};
着色器工作正常。发生此错误是因为未正确安装库graphics.h。。 .
您可以从下载错误的英文版本吗?我不确定是什么错误,因为错误是用非英语编写的。但我猜这可能是一个循环依赖错误。为什么要将引擎传递给gameLoop?例如,为什么需要Renderer.h中的engine.h。我看不到您在Renderer.cpp的任何地方使用它。在Enginer.h.Downvoting中有一个Renderer.h,因为错误不是英文的。我知道要让VS用英语输出错误需要额外的步骤,但一个英语网站也是如此。我看不出问题和答案之间有任何联系。也许有一个,但需要更好地解释。OP没有以任何方式使用图形.h
#include "Renderer.h"
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
Renderer::Renderer()
{
ShaderSource source = parseShader("res/shaders/basic.shader");
m_Shader1 = createShader(source.VertexSource, source.FragmentSource);
GLCall(glUseProgram(m_Shader1));
GLCall(m_uVar1 = glGetUniformLocation(m_Shader1, "u_Color"));
GLCall(glUseProgram(0));
}
Renderer::~Renderer()
{
GLCall(glDeleteProgram(m_Shader1));
}
ShaderSource Renderer::parseShader(const std::string filePath)
{
std::ifstream stream(filePath);
enum class ShaderType
{
NONE = -1, VERTEX = 0, FRAGMENT = 1
};
std::string line;
std::stringstream ss[2];
ShaderType type = ShaderType::NONE;
while (getline(stream, line))
{
if (line.find("#shader") != std::string::npos)
{
if (line.find("vertex") != std::string::npos)
type = ShaderType::VERTEX;
else if (line.find("fragment") != std::string::npos)
type = ShaderType::FRAGMENT;
}
else
{
ss[(int)type] << line << "\n";
}
}
return { ss[0].str(), ss[1].str() };
}
unsigned int Renderer::compileShader(unsigned int type, std::string source)
{
GLCall(unsigned int id = glCreateShader(type));
const char* src = source.c_str();
GLCall(glShaderSource(id, 1, &src, nullptr));
GLCall(glCompileShader(id));
int result;
GLCall(glGetShaderiv(id, GL_COMPILE_STATUS, &result));
if (result == GL_FALSE)
{
int length;
GLCall(glGetShaderiv(id, GL_INFO_LOG_LENGTH, &length));
char* msg = (char*)alloca(length * sizeof(char));
GLCall(glGetShaderInfoLog(id, length, &length, msg));
std::cout << "Failed to compile " << (type == GL_VERTEX_SHADER ? "vertex" : "fragment") << "shader!" << std::endl;
std::cout << msg << std::endl;
return 0;
}
return id;
}
unsigned int Renderer::createShader(std::string vertexShader, std::string fragmentShader)
{
GLCall(unsigned int program = glCreateProgram());
unsigned int vs = compileShader(GL_VERTEX_SHADER, vertexShader);
unsigned int fs = compileShader(GL_FRAGMENT_SHADER, fragmentShader);
GLCall(glAttachShader(program, vs));
GLCall(glAttachShader(program, fs));
GLCall(glLinkProgram(program));
GLCall(glValidateProgram(program));
GLCall(glDeleteShader(vs));
GLCall(glDeleteShader(fs));
return program;
}
Buffers Renderer::createBuffer(const void* vertices, const unsigned int* indices, unsigned int vertexCount, unsigned int indexCount)
{
Buffers newB(vertices, indices, vertexCount, indexCount);
return newB;
}
void Renderer::render(Buffers buffer, GameVars vars)
{
buffer.bind();
GLCall(glUseProgram(m_Shader1));
GLCall(glUniform4f(m_uVar1, vars.r, vars.g, vars.b, vars.alpha));
GLCall(glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, nullptr));
GLCall(glUseProgram(0));
buffer.unbind();
}
#pragma once
#include "Engine.h"
#include "Buffers.h"
class Renderer
{
private:
unsigned int m_Shader1;
unsigned int m_uVar1;
ShaderSource parseShader(const std::string filePath);
unsigned int compileShader(unsigned int type, std::string source);
unsigned int createShader(std::string vertexShader, std::string fragmentShader);
public:
Renderer();
~Renderer();
Buffers createBuffer(const void* vertices, const unsigned int* indices, unsigned int vertexCount, unsigned int indexCount);
void render(Buffers buffer, GameVars vars);
};
#include "Buffers.h"
#include "Engine.h"
Buffers::Buffers(const void* vertices, const unsigned int* indices, unsigned int vertexCount, unsigned int indexCount)
: m_iCount(indexCount)
{
ASSERT(sizeof(unsigned int) == sizeof(GLuint));
GLCall(glGenVertexArrays(1, &m_vaoID));
GLCall(glBindVertexArray(m_vaoID));
GLCall(glGenBuffers(1, &m_vBuffID));
GLCall(glBindBuffer(GL_ARRAY_BUFFER, m_vBuffID));
GLCall(glBufferData(GL_ARRAY_BUFFER, vertexCount * sizeof(float), vertices, GL_STATIC_DRAW));
GLCall(glEnableVertexAttribArray(0));
GLCall(glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), 0));
GLCall(glGenBuffers(1, &m_iBuffID));
GLCall(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_iBuffID));
GLCall(glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexCount * sizeof(GLuint), indices, GL_STATIC_DRAW));
GLCall(glBindBuffer(GL_ARRAY_BUFFER, 0));
}
Buffers::~Buffers()
{
GLCall(glDeleteBuffers(1, &m_iBuffID));
GLCall(glDeleteBuffers(1, &m_vBuffID));
GLCall(glDeleteVertexArrays(1, &m_vaoID));
}
void Buffers::bind() const
{
GLCall(glBindVertexArray(m_vaoID));
GLCall(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_iBuffID));
}
void Buffers::unbind() const
{
GLCall(glBindVertexArray(0));
GLCall(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0));
}
#pragma once
class Buffers
{
private:
unsigned int m_iBuffID;
unsigned int m_vBuffID;
unsigned int m_vaoID;
unsigned int m_iCount;
public:
Buffers(const void* vertices, const unsigned int* indices, unsigned int vertexCount, unsigned int indexCount);
~Buffers();
void bind() const;
void unbind() const;
inline unsigned int getIndexCount() { return m_iCount; }
};